it-swarm.com.de

Wie programmiere ich die Thread-Zuordnung auf Multicore-Prozessoren?

Ich möchte mit Threads auf einem Multi-Core-Prozessor experimentieren, z. um ein Programm zu erstellen, das zwei verschiedene Threads verwendet, die von zwei verschiedenen Prozessorkernen ausgeführt werden.

Mir ist jedoch nicht klar, auf welcher Ebene die Threads den verschiedenen Kernen zugeordnet werden. Ich kann mir folgende Szenarien vorstellen (abhängig vom Betriebssystem und der Implementierung der Programmiersprache):

  1. Die Thread-Zuordnung wird vom Betriebssystem verwaltet. Threads werden mithilfe von Systemaufrufen des Betriebssystems erstellt. Wenn der Prozess auf einem Multi-Core-Prozessor ausgeführt wird, versucht das Betriebssystem automatisch, verschiedene Threads auf verschiedenen Kernen zuzuweisen/zu planen.
  2. Die Thread-Zuweisung wird von der Implementierung der Programmiersprache verwaltet. Das Zuweisen von Threads zu verschiedenen Kernen erfordert spezielle Systemaufrufe, aber die Standard-Thread-Bibliotheken der Programmiersprache behandeln dies automatisch, wenn ich die Standard-Thread-Implementierung für diese Sprache verwende.
  3. Die Thread-Zuordnung muss explizit programmiert werden. In meinem Programm muss ich expliziten Code schreiben, um zu erkennen, wie viele Kerne verfügbar sind, und um verschiedenen Threads unterschiedliche Threads zuzuweisen, indem ich beispielsweise Bibliotheksfunktionen verwende.

Stellen Sie sich vor, ich habe meine Multithread-Anwendung in Java oder C++ unter Windows oder Linux) geschrieben. Wird meine Anwendung auf magische Weise mehrere Kerne sehen und verwenden, wenn sie auf einem Multi-Core ausgeführt wird? Prozessor (weil alles entweder vom Betriebssystem oder von der Standard-Thread-Bibliothek verwaltet wird), oder muss ich meinen Code ändern, um die mehreren Kerne zu kennen?

13
Giorgio

Wird meine Anwendung auf magische Weise mehrere Kerne sehen und verwenden, wenn sie auf einem Multi-Core-Prozessor ausgeführt wird (da alles entweder vom Betriebssystem oder von der Standard-Thread-Bibliothek verwaltet wird), oder muss ich meinen Code ändern, um die mehreren Kerne zu kennen ?

Einfache Antwort : Ja, es wird normalerweise vom Betriebssystem oder der Threading-Bibliothek verwaltet.

Das Threading-Subsystem im Betriebssystem weist den Prozessoren vorrangig Threads zu (Option 1). Mit anderen Worten, wenn ein Thread die Ausführung für seine Zeitzuweisung oder Blöcke beendet hat, sucht der Scheduler nach dem Thread mit der nächsthöheren Priorität und weist diesen der CPU zu. Die Details variieren von Betriebssystem zu Betriebssystem.

Es gibt jedoch die Optionen 2 (von der Programmiersprache verwaltet) und 3 (explizit). Beispielsweise bieten die Aufgabenbibliothek und async/await in neueren Versionen von .Net dem Entwickler eine viel einfachere Möglichkeit, parallelisierbaren Code zu schreiben (d. H. Der gleichzeitig mit sich selbst ausgeführt werden kann). Funktionale Programmiersprachen sind von Natur aus parallelisierbar und einige Laufzeiten führen nach Möglichkeit verschiedene Teile des Programms parallel aus.

Bei Option 3 (explizit) können Sie in Windows die Thread-Affinität festlegen (Angabe, auf welchen Prozessoren ein Thread ausgeführt werden kann). Dies ist jedoch normalerweise in allen außer den schnellsten Systemen mit kritischer Reaktionszeit nicht erforderlich. Eine effektive Zuordnung von Thread zu Prozessor ist stark hardwareabhängig und reagiert sehr empfindlich auf andere Anwendungen, die gleichzeitig ausgeführt werden.

Wenn Sie experimentieren möchten, erstellen Sie eine lange laufende, CPU-intensive Aufgabe wie das Generieren einer Liste von Primzahlen oder das Erstellen eines Mandelbrot-Sets. Erstellen Sie nun zwei Threads in Ihrer Lieblingsbibliothek und führen Sie beide Threads auf einem Multiprozessor-Computer aus (mit anderen Worten, fast alles, was in den letzten Jahren veröffentlicht wurde). Beide Aufgaben sollten ungefähr zur gleichen Zeit ausgeführt werden, da sie parallel ausgeführt werden.

11
akton