Kann ein Single-Thread-Programm zur Verwendung mehrerer Kerne erstellt werden?

12

Der Titel sagt schon alles: Gibt es eine Möglichkeit, ein älteres Programm für die Verwendung eines einzelnen CPU-Kerns für die Verwendung mehrerer CPU-Kerne zu entwickeln?

Chris
quelle
13
Nein nicht möglich
Moab
5
Wenn es nur so einfach wäre ...
Brendan Long
1
Was wäre, wenn es ein Programm gäbe, das einen Prozessor "emuliert" (wie z. B. ein VM?), Aber Ihre Multi-Core-CPU und eine Single-Core-CPU mit viel mehr Prozessorleistung pro Thread emuliert? Ist das möglich?
schizoid04
Wer wird dann die Synchronisation zwischen mehreren Threads verwalten, weil die Reihenfolge zählt.
user36582

Antworten:

16

Leider kann ein Legacy-Programm, das für eine einzelne CPU geschrieben wurde, nicht gezwungen werden, mehrere CPU-Kerne zu verwenden. Die Verwendung mehrerer CPU-Kerne erfordert mehrere Threads, die miteinander kommunizieren müssen, ohne dass Race-Bedingungen oder andere Probleme auftreten. Eine ältere Anwendung kann nur dann mehr als den CPU-Kern verwenden, wenn sie entsprechend der Art der Anwendung parallelisiert werden kann.

bwDraco
quelle
19
Es ist auch erwähnenswert, dass einige Anwendungen einfach nicht umgeschrieben werden können, um mehrere Kerne zu berücksichtigen. Es hängt hauptsächlich davon ab, wie parallelisierbar der Prozess ist. Ein einfaches Beispiel für einen nicht parallelisierbaren Prozess wäre die menschliche Fortpflanzung: Eine Frau kann in 9 Monaten ein Kind bekommen. Neun Frauen können in neun Monaten neun Kinder zeugen, aber mit neun Frauen kann man in einem Monat kein einziges Kind zeugen.
AndrejaKo
1
Im Prinzip könnte man ein Programm schreiben, um ein anderes Programm zu analysieren und zu parallelisieren. Das heißt, selbst sehr begrenzte "einfache" Versionen dieses Problems haben einen Doktortitel hervorgebracht. Dissertationen in den letzten Generationen und Fortschritte waren langsam. Das vollständige Problem kann durchaus AI-vollständig sein.
dmckee --- Ex-Moderator Kätzchen
Großartig, ich danke Ihnen allen, Sie haben mich mit Ihrem Frauen- und Geburtsbeispiel grion gemacht, besonders wenn Sie über die Herstellung sprechen: D
Chris
Was ist, wenn ein Programm eine Reihe unabhängiger mathematischer Operationen enthält, die später füreinander verwendet werden? vielleicht kann ein zweiter thread das programm parsen, hmm ich weiß nicht was ich sage. Wenn ein Thread eine Assembly analysieren könnte ... "hier eine teure Operation ausführen, dann eine zweite teure Operation ausführen, die die erste teure Operation nicht berührt" Okay, ich werde eine teure Operation auf einen Thread anwenden, eine auf den anderen, und sie dann synchronisieren wieder auf dem Hauptfaden. Ich nehme an, ein ganzes Programm müsste vorab analysiert werden, um unabhängige teure Operationen zu identifizieren.
CausingUnderflowsEverywhere
13

Was ist dein Ziel damit? Leistungssteigerung? Leider werden Anwendungen, bei denen nur 1 Kern verwendet werden soll, nicht mehr verwenden. Das ist es, worum es in diesem Vortrag bei "Multi-Threaded" -Anwendungen geht.


quelle
2

Es gibt mindestens drei Techniken zum Ausnutzen mehrerer Prozessoren in einem Programm, das für die Verwendung eines einzelnen Kerns ausgelegt ist. Am einfachsten ist es, Bibliotheken und Systemcode zu verwenden, die mehrere Kerne verwenden oder zumindest teilweise parallel zum Anwendungscode ausgeführt werden können. Die Garbage Collection ist ein Beispiel für Funktionen, die parallelisiert werden können und möglicherweise parallel zur Anwendungsausführung ausgeführt werden können. Auch ohne automatische Speicherverwaltung besteht ein gewisses Potenzial für Parallelität bei Speicherfreigabefunktionen, da der Speicherzuweiser möglicherweise etwas zu tun hat, als nur den Speicherabschnitt als verfügbar zu markieren.

Eine zweite Technik ist die binäre Übersetzung. Dies kann zwar als "Umschreiben der Anwendung" angesehen werden, wird jedoch per Software und ohne Zugriff auf den Quellcode durchgeführt. Die Herstellung von Parallelität auf Thread-Ebene scheint nicht das Hauptziel der meisten Forschungs- und Entwicklungsarbeiten mit Hilfe der binären Übersetzung gewesen zu sein (was häufig das Ausführen von Legacy-Code auf einem anderen ISA, das Ausnutzen von ISA-Erweiterungen oder das Optimieren für eine bestimmte Mikroarchitektur und die Verwendung dynamischer Informationen zur Bereitstellung höherer Informationen betrifft) qualitätsprofilorientierte Optimierung), aber das Potenzial ist offensichtlich.

Eine dritte Technik ist das spekulative Multithreading. Derzeit unterstützen keine Prozessoren (die ich kenne) Hardware-verwaltetes spekulatives Multithreading. Mit der Einführung des Hardware-Transaktionsspeichers wird es jedoch etwas praktischer, ein solches Laufzeitsystem zu implementieren, da der HTM verwendet werden kann, um Konflikte bei der Speichernutzung zu erkennen. Softwaregesteuertes spekulatives Multithreading würde typischerweise eine binäre Übersetzung beinhalten, aber seine spekulative Natur rechtfertigt die Betrachtung einer separaten Technik.

Die Praktikabilität dieser Techniken wird durch die mit vorhandenen Systemen verbundenen Kosten (einschließlich der Kosten für die Kommunikation zwischen Threads und für das Laichen von Threads), durch die begrenzte Parallelität, die sie ausnutzen können, und durch die begrenzte Kapitalrendite (wichtige Anwendungen, die vorteilhaft sein können) begrenzt Es ist wahrscheinlich, dass parallelisierte Anwendungen neu geschrieben werden. Viele Anwendungen würden von solchen Techniken nur relativ wenig profitieren (insbesondere, wenn die Leistung / Wärme-Begrenzung es einem einzelnen Kern ermöglicht, mit einer höheren Frequenz als bei mehreren Kernen zu arbeiten), und die Entwicklungskosten sind erheblich. Doch diese Techniken tun exist und es ist theoretisch möglich , mehrere Kerne mit einer zu bedienende Anwendung einen einzelnen Kern zu verwenden.

Paul A. Clayton
quelle
0

Nein, das kann nicht sein. Ein Programm ist explizit für die Verwendung mehrerer Kerne geschrieben. Es ist nicht trivial, die Arbeit in mehreren Kernen zu erledigen. Es erfordert Synchronisationen aller Threads. Als würde einer den Ball werfen, der andere fangen, einer den Ball polieren, einer säubern, einer den Ball prüfen, ob er eine gute Luftmenge enthält. Stellen Sie sich nun vor, jedes Zeichen läuft unabhängig voneinander in einem Thread. Jemand versucht, den Ball zu fangen, wenn er nicht geworfen wird. Oder jemand versucht, den Ball zu polieren, während er gespielt wird. Oder zwei Charaktere, die gleichzeitig versuchen, den Ball zu fangen und zu werfen. Es gibt so viele Möglichkeiten zum Absturz. Daher müssen Programmierer eine einzelne Kernanwendung sorgfältig neu entwerfen, damit sie die Vorteile mehrerer Kerne nutzen kann.

user36582
quelle