Seite 1 von 1

Parrallel Programmierung

Verfasst: Freitag 18. Mai 2018, 15:11
von Simon123
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

Re: Parrallel Programmierung

Verfasst: Freitag 18. Mai 2018, 17:24
von kbr
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.

Re: Parrallel Programmierung

Verfasst: Dienstag 22. Mai 2018, 16:52
von Simon123
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

Re: Parrallel Programmierung

Verfasst: Mittwoch 23. Mai 2018, 15:28
von pyzip
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