Shell: parallelisieren von Berechnungsabläufen

B

Bad_Rockk

Mitglied
Hallo zusammen,

habe eine Frage zur Parallelisierung von Abläufen innerhalb eines Shellskripts.

Mein Skript ist folgendermaßen aufgebaut:

Code:
NR=50
l=1
while [ $l -le $NR ]; do
   $EXE_CALL_1
   mv $OUTPUT_FILES_1 $RESULT_DIR

   $EXE_CALL_2
    mv $OUTPUT_FILES_2 $RESULT_DIR

   let l=$l+1

done

Durch die EXE_CALLS werden jeweils Berechnungsprogramme aufgerufen und die jeweilige Berechnung gestartet. Der EXE_CALL_2 braucht die Ergebnisse von EXE_CALL_1 um zu rechnen. Meine Frage wäre jetzt diese, kann ich so eine Berechnung auch parallelisieren? Dachte mir dass wenn ich das Rechenprogramm nochmals unter einem anderen Pfad installiere, könnte ich die unabhängig voneinander mit Daten füttern.

Dachte das wenn $l gerade ist Weg 1 genommen wird und wenn $l ungerade ist den zweiten Weg genommen wird. Aber wie kann ich dem Skript sagen, dass er sobald er EXE_CALL_2 angestoßen hat, l=$l+1 ausführt und dadurch einen neuen Schleifendurchgang auslöst? Aber bei Beendigung von EXE_CALL_2 dann noch die im Skript stehenden Befehle abarbeitet.

Geht sowas überhaupt? Wäre genial, dadurch könnte ich Rechenzeit einsparen. Rechne momentan nur auf einem Prozessor und der andere ist gelangweilt. Bei momentanen Rechenzeiten von 5 Stunden, wäre jede Reduktion ein Erfolg. Auch in dem Betracht, dass es wohl nicht bei der Anzahl momentaner Rechnungen bleibt.

Gruß
 
Du musst das Programm nicht öfter installieren, du suchst vermutlich sowas wie jobs.

Es ist zwar nicht wirklich sauber, aber du kannst ja zb sowas machen:
Code:
NR=50
CORES=2

l=1
while [ $l -le $NR ]; do
        while [ $(  jobs  | wc -l ) -ge $CORES ]
        do
                  sleep 10s
        done

        $EXE_CALL_1 && mv $OUTPUT_FILES_1 $RESULT_DIR &&
        $EXE_CALL_2 && mv $OUTPUT_FILES_2 $RESULT_DIR &

   let l=$l+1

done

Das sollte dir 2 instanzen von $EXE_CALL_1 starten, was ich dabei allerdings nicht versteh ist welches Programm von welchem abhängt, fütterst du $EXE_CALL_1 jedesmal mit anderen daten, die dann von $EXE_CALL_2 abearbeitet werden?

Vor allem kannst du 2 $EXE_CALL_1 gleichzeitig nebeneinander laufen lassen?
 
Bist Du auf der Suche nach sowas wie torque? Ansonsten könnte "cluster" als Stichwort hilfreich sein, dein Problem hört sich nach SPMD an.
 
Hallo,

@marcellus:
genau, EXE_CALL_1 wird bei jedem Schleifendurchgang mit anderen Werten gefüttert. Und mein EXE_CALL_1 erzeugt eine Übergabedatei für EXE_CALL_2. Damit kann kann EXE_CALL_2 rechnen.

Den EXE_CALL_1 kann ich nicht 2 mal gleichzeitig laufen lassen. Problem ist hier, dass ich eine Eingabedatei in das Arbeitsverzeichnis von EXE_CALL_1 verschieben muss damit das Programm damit rechnet. In das gleiche Verzeichnis werden die Ausgabedateien geschrieben. Daher kann ich nicht 2 Eingabedateien gleichzeitig in einem Ordner haben. Aber der EXE_CALL_1 dauert ca. 2-4 Sekunden. Daher ist das auch nicht tragisch. Der EXE_CALL_2 braucht 2-3 Minuten. Da wäre es eben schön wenn ich da eben parallel rechnen könnte. Aber da besteht das gleiche Problem wie bei EXE_CALL_1, die Eingabedatei und die Ausgabedateien müssen in Arbeitsverzeichnis abgelegt werden... daher werde ich um eine zweite Installation nicht rum kommen.

Werde mir die jobs mal angucken. Vielleicht kann ich damit trotzdem was anfangen.

@foobarfu:
SPMD? Für was steht das denn? Werde mir das torque mal durchlesen, vielleicht hilft mir das auch weiter.

Gruß
 
Kannst du nicht eine Variable in den Arbeitsverzeichnisnamen einfügen und die Berechung dann in dem jeweiligen Verzeichnis machen?
Also für jeden EXE_CALL1 ein eigenes Arbeitsverzeichnis erstellen (und dann wohl für EXE_CALL2 auch) und den Process dann darin arbeiten lassen.
 
Doch, das dürfte gehen.
Und wie stoße ich dann die Berechnungen alle an? Die verschiedenen Werte realisiere ich eben über die Schleifenkonstruktion. Da werden pro Iteration ein anderer Satz Parameter eingelesen und verarbeitet.

Das mit den jobs habe ich noch nicht wirklich verstanden, auch bei dem Beispiel von marcellus steig ich noch nicht ganz durch.
 
Das mit den jobs habe ich noch nicht wirklich verstanden, auch bei dem Beispiel von marcellus steig ich noch nicht ganz durch.

Na gut kurze einführung in jobs, die befehle, die für job control verwendet werden sind:
  • jobs
    (zeigt die laufenden jobs)
  • fg NR
    (schickt einen job aus dem hintergrund in den fordergrund)
  • bg NR
    (lässt einen job im hintergrund weiterlaufen)
  • befehl &
    (startet einen Befehl im hintergrund)
  • Strg^Z
    (hält den befehl im Vordergrund an)

ein Praktisches Beispiel dafür:
Code:
$ sleep 1m &
[1] 7198
$ jobs
[1]+  Running                 sleep 1m &
$ fg 1
sleep 1m
^Z
[1]+  Stopped                 sleep 1m
$ bg 1
[1]+ sleep 1m &

Das script wartet je 10 sekunden, wenn gleich viele jobs laufen wie prozessorkerne existieren.
Wenn es zu wenige jobs gibt startets eine instanz von deinem Befehl im hintergrund und geht wieder in die schleife zurück wos wartet.
 

Ähnliche Themen

Server-Monitoring mit RRDTool

Zurück
Oben