Nutzen mehrere Unterprozesse mehrere Kerne?

Nutzen mehrere Unterprozesse mehrere Kerne?

Ich habe eine Frage und sie dreht sich im Wesentlichen um die Untersuchung einiger einfacher Möglichkeiten zur Nutzung aller Kerne einer Maschine.

Angenommen, ich habe das Programm „./dasProgramm“, das auf einen Datensatz D einwirkt, „peinlich parallel“ ist und ein Befehlszeilenargument j annimmt, das das Programm auf einer durch j bestimmten Teilmenge seines Datensatzes ausführt.

Nehmen wir dann an, dass ich in meinem Terminal die Befehle ausführe

./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &

Jetzt habe ich Unterprozesse für j1, j2, ... jfinal erzeugt

Meine Frage: Angenommen, ich habe ein einigermaßen modernes Unix-System (sagen wir das neueste Mac OS X, das auf einem Multicore-Chip läuft)

Werden die Prozesse dann separat auf alle Kerne verteilt? D. h., ich nutze ALLE meine Kerne aus?

Antwort1

Theoretisch ja.

Das Betriebssystem plant Aufgaben auf ungenutzten CPU-Kernen. Es weiß, wann ein Kern ungenutzt ist, weil es gerade eine Aufgabe von ihm aus dem Zeitplan genommen hat.

Ihre Prozesse verfügen in ihren Strukturen über eine Markierung, die angibt, ob sie auf eine Eingabe (Festplatte, Tastatur, Maus usw.) warten. Wenn sie auf keines dieser Dinge warten, sind sie planbar.

Für jeden Kern durchläuft das Betriebssystem im Wesentlichen seine Liste der planbaren Aufgaben und plant sie. Den Aufgaben wird ein Zeitabschnitt auf dem Kern zugewiesen und sie werden dann wieder angehalten, damit das Betriebssystem sehen kann, obandereProzesse müssen ausgeführt werden.

Wenn keine anderen Prozesse ausgeführt werden müssen, steht Ihr Prozess weiterhin oben auf der Liste und bekommt eine weitere Chance.

Der natürliche Effekt besteht darin, dass Ihre CPU mit einem geringen Verwaltungsaufwand vollständig genutzt wird, vorausgesetzt, keiner Ihrer Prozesse blockiert sich gegenseitig oder verbringt peinlich viel Zeit mit dem Warten auf Festplattenzugriffe.

Sie können dies mit jeder Multithread-Anwendung mit parallelisierbaren Daten testen. Videocodierung und Datenkomprimierung sind zwei Situationen, in denen sich diese Art der Parallelität auszahlt.

Handbrake ist ein CPU-basierter Video-Encoder (seit kurzem auch mit GPU-Unterstützung), der beliebig viele CPU-Kerne nutzen kann und dadurch eine deutliche Geschwindigkeitssteigerung erreicht. Viele Video-Encoder können mehrere Kerne gut nutzen. x.264 und andere Encoder unterstützen auch mehrere Threads.

7-Zip ist ein Komprimierungsprogramm, das in seinem LZMA2-Algorithmus auch mehrere Threads verwenden kann, um die Komprimierung zu beschleunigen. Der Aufbau des Komprimierungswörterbuchs ist ein sinnvoller gemeinsamer Prozess, und sobald Sie ein Wörterbuch haben, ist die eigentliche Komprimierung „trivial“ parallelisierbar.

Antwort2

Um Multiprozessing durchzuführen, müssen Sie den Codeabschnitt auswählen, der Folgendes einhält:

  1. Man kann sich nicht auf frühere Ergebnisse verlassen
  2. Muss nicht in einer bestimmten Reihenfolge ausgeführt werden
  3. Gibt nichts zurück, auf das später im Code zugegriffen werden muss

Aus dem, was ich gehört habe, folgt, dass Sie mehrere Kerne nutzen können sollten.

verwandte Informationen