Shell: parallelisieren von Berechnungsabläufen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Bad_Rockk, 03.08.2010.

  1. #1 Bad_Rockk, 03.08.2010
    Bad_Rockk

    Bad_Rockk Mitglied

    Dabei seit:
    07.07.2010
    Beiträge:
    27
    Zustimmungen:
    0
    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ß
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 marcellus, 03.08.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    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?
     
  4. #3 foobarflu, 03.08.2010
    foobarflu

    foobarflu Foren As

    Dabei seit:
    21.12.2003
    Beiträge:
    79
    Zustimmungen:
    0
    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.
     
  5. #4 Bad_Rockk, 04.08.2010
    Bad_Rockk

    Bad_Rockk Mitglied

    Dabei seit:
    07.07.2010
    Beiträge:
    27
    Zustimmungen:
    0
    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ß
     
  6. NoXqs

    NoXqs Routinier

    Dabei seit:
    07.05.2007
    Beiträge:
    420
    Zustimmungen:
    0
    Ort:
    Bremen
    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.
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. #6 Bad_Rockk, 04.08.2010
    Bad_Rockk

    Bad_Rockk Mitglied

    Dabei seit:
    07.07.2010
    Beiträge:
    27
    Zustimmungen:
    0
    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.
     
  9. #7 marcellus, 04.08.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    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.
     
Thema:

Shell: parallelisieren von Berechnungsabläufen

Die Seite wird geladen...

Shell: parallelisieren von Berechnungsabläufen - Ähnliche Themen

  1. Shell Skript beschleunigen

    Shell Skript beschleunigen: Hallo zusammen, ich bin neu hier und hab gerade angefangen mich an Schell Skripte zu wagen. Nun hab eine Frage ich hab ein Skript geschrieben und...
  2. [Erledigt] Shell-Skript lässt sich nicht mit Cron ausführen

    [Erledigt] Shell-Skript lässt sich nicht mit Cron ausführen: Hallo, ich hoffe ihr könnt mir helfen. Ich entwerfe im Moment ein Skript, welches den Callmonitor (Telnet) auf meiner FritzBox abfragt und wenn...
  3. Shell-Skript Datum in einer Datai suchen

    Shell-Skript Datum in einer Datai suchen: Hallo zusammen Ich komm eigentlich aus der Klicki-Bunti-Welt von Windows. Seit geraumer Zeit versuche ich meine Künste mit verschiedenen...
  4. Shell Script Problem

    Shell Script Problem: Hallo zusammen, ich arbeite momentan mit einem Plagiat Tool, die ich über Git Bash ausführe. Es wird im Endeffekt ein Link generiert, die ich...
  5. Anonymisierungs-Distribution Tails 2.0 wechselt zu Gnome Shell

    Anonymisierungs-Distribution Tails 2.0 wechselt zu Gnome Shell: Tails (The Amnesic Incognito Live System) ist in Version 2.0 erschienen und bringt als Dektopoberfläche eine Gnome-Shell im Classic-Modus mit....