Parrallel Programmierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Simon123
User
Beiträge: 10
Registriert: Freitag 17. November 2017, 18:17

Hallo zusammen,

ich moechte eine Schleife parallelisieren. Die Struktur ist die folgende:

Code: Alles auswählen

class1 = open_some_class()
for i in range(4):
    for j in range(4):
        for k in range(4):
        class1.function1(i,j)
        class1.function2(k)
        class1.function3()
function1 und function2 der Klasse class1 setzen mir einige self.parameter fest indem es verschieden Daten abhaengig von i,j und k einliesst. function3 erstellt mir dann eine output.dat nachdem es einige Berechnungen durchgefuehrt hat. Ich wuerde nun gerne diese Schleife parallelisieren, sodass jedes (i,j,k) auf einem seperaten Kern berechnet wird. Im Internet habe ich hierzu das Module Joblib gefunden. Eine einfache einzelne Funktion wie f(x)=x**2 fuer verschiedene x zu parallesieren ist relativ einfach:

Code: Alles auswählen

from joblib import Parallel,delayed
Parallel()(delayed(f)(i) for i in range(10))
Allerdings ist mir unklar, wie ich das auf meinen etwas anderen Fall verallgemeinern kann. Hat hier jemand eine Idee und koennte mir bitte weiterhelfen?

Vielen Dank und viele Gruesse,
Simon
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Ob eine Parallelisierung machbar ist, hängt davon ab, was in den Methoden passiert. Zunächst einmal sind alle Deine Methoden von i, j und k abhängig, da sie alle dem Produkt entsprechend oft aufgerufen werden. Falls das irrelevant ist, kannst Du bereits jetzt schon deutlich optimieren.

Falls nicht, könntest Du ggf. die Iteration über i auf vier Prozesse aufteilen. Mit dem multiprocessing Modul geht so was gut – ob joblib die Sache vereinfacht, weiß ich nicht.

Falls aber einige Funktionsaufrufe von zuvor berechneten Ergebnissen abhängig sind, dann wird es mit der Parallelisierung schwer bis unmöglich.
Simon123
User
Beiträge: 10
Registriert: Freitag 17. November 2017, 18:17

Danke fuer deine Hilfe.

Koennte ich nicht eine Funktion schreiben function4(i,j,k) die mir function1 bis function3 ausfuehrt. Dann haette ich nur eine Funktion und koennte moeglicherweisse joblib verwenden?

Bei der ganzen Sache geht es mehr um das Verschicken von batch jobs an einen Server.
Das Ausfuehren der function1 bis 3 dauert ungefaehr 24 h was der maximalen Rechenzeit auf dem Server entspricht. Ich moechte aber function 1 bis 3 fuer verschiedene Parameter laufen lassen. Aufgrund der langen Rechenzeit faellt die simple i,j,k loop weg, aber im Prinzip funktioniert es, wenn ich jeden Schritt der Loop per Hand selber eintippe und den batch job jedesmal neu verschicke. Da dies aber sehr aufwendig ist, habe ich mir gedacht, dass ich das ganze parallel laufen lassen koennte, damit ich nicht per Hand jedesmal alle Parameter aendern muss um den Job dann neu loszuschicken. Leider habe ich damit bisher keinerlei Erfahrung. Macht das ueberhaupt so Sinn wie ich mir das vorstelle?


Viele Gruesse,
Simon
pyzip
User
Beiträge: 89
Registriert: Freitag 16. Juni 2017, 19:36

Hallo, du könntest es mit "queue's" und "threads" versuchen. Wenn sich allerdings die Threads gegenseitig mit Werten versorgen müssen, dann ist nichts mehr mit Parallelisierung, da die dann ja immer auf etwas warten müssen. In dem Fall würde ich die Schleifen einfach laufen lassen.
Gruß Rainer
Antworten