Prozesse optimal auf Kerne verteilen

Anub1s

Lieutenant
Registriert
Aug. 2006
Beiträge
720
Hallo,

ich habe ein Programm, dass ich jeweils mit einer von mehreren Dateien als Parameter aufrufe. Ich würde nun gerne alle Instanzen des Programms im möglichst kurzer Zeit laufen lassen.
Das Programm selbst lastet genau einen CPU-Kern voll aus. Die Laufzeit des Programms ist grob linear zur Größe der Datei (läuft also mit einer 1MB-Datei ca. doppelt so lang wie mit 500KB).

Gehen wir mal von c CPU-Kernen aus. Der einfachste Aufruf von der Kommandozeile aus, ist "prog1 file1 | progr1 file2 | prog1 file3 ...". Damit werden alle Dateien gleichzeitig abgearbeitet. Jetzt ist das aber nicht wirklich optimal. Nehmen wir an, file1 und file2 sind jeweils 1MB groß, file3 aber 2MB. Nach einer gewissen Zeit (wenn jedes Programm etwa die gleiche CPU-Zeit zugeteilt bekommt) sind von allen files 1MB abgearbeitet. Folge: die restlichen 50% der Zeit läuft die zweite Hälfte von file3 auf einem CPU-Kern, während sich der andere langweilt. Besser wäre es in dem Fall also, wenn file3 von Anfang an einen Kern bekommt, und sich file1 und file2 den zweiten Kern teilen.

Was ich nun suche, ist eine Möglichkeit das ganze auf X Kerne und Y Dateien zu verallgemeinern. Ich schätze, dass die Laufzeit ideal sein müsste, wenn jede Instanz prozentual soviel CPU-Zeit von allen Kernen bekommt, wie die Parameter-Datei anteil an der Gesamtgröße aller Dateien hat. Allerdings weiß ich nicht, wie ich so etwas umsetzen könnte. Ich hoffe da kann mir jemand weiterhelfen.


MfG Anub1s
 
Die Möglichkeit, das ganze selbst zu programmieren besteht natürlich. Ich hatte in dem Fall gehofft, dass es da direkt für die Kommandozeile unter Linux eine einfache Variante gibt.
 
Der Titel dieses Forums lautet Programmieren!

Hast du geglaubt, man müsse einfach nur einen Befehl in der Kommandozeile eingeben und der Algorithmus in deinem Programm parallelisiert sich auf magische Art und Weise von selbst?

Ja, das wäre schon eine feine Sache, dann könnten wir uns das Thema Multithreading komplett sparen.
 
Eine selbstprogrammierte Multithreading-Umgebung scheint mir etwas mit Kanonen auf Spatzen geschossen, deswegen hatte ich nach einer einfacheren Lösung gesucht.
Ich habe gerade beim stöbern "nice" gefunden, mit dem ich wohl unterschiedliche Prioritäten an die Prozesse verteilen kann. Ich werde die Tage mal schaun, ob das vielleicht schon ausreicht, es geht wie gesagt weniger um gesparte Sekunden, sonder darum dass nicht im ungünstigsten Fall die Hälfte der Zeit nur ein Kern was zu schaffen hat.
 
Die Priorität von Prozessen kann in jedem vernünftigen Taskmanager festgelegt werden.

Anub1s schrieb:
es geht wie gesagt weniger um gesparte Sekunden, sonder darum dass nicht im ungünstigsten Fall die Hälfte der Zeit nur ein Kern was zu schaffen hat.

Daran wird eine Änderung der Prozesspriorität nichts ändern können. Ein Single-Threaded-Programm lastet immer nur einen Kern aus, egal welche Priorität du da einstellst.

Die Priorität legt nur fest, wieviel Rechenzeit der Prozess auf diesem einen Kern zugewiesen bekommt, d.h. ob er dort dauerhaft läuft oder mit längeren bzw. kürzeren Pausen.
 
Zuletzt bearbeitet:
Linux verfügt über einen leistungsfähigen Scheduler. Prozesse und Threads werden automatisch und in geeigneter Weise auf verfügbare Kerne verteilt. Ich denke, dass gar hier kein manueller Eingriff notwendig ist. Im Taskmanager kann man das bequem mitverfolgen.
 
Zurück
Oben