Seite 2 von 2

Re: Parallelprogrammierung?

Verfasst: Donnerstag 21. Juni 2012, 14:41
von /me
jens hat geschrieben:schon mal über pypy nachgedacht?
numpy ist mit PyPy aber noch etwas wackelig.

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 12:07
von Arp
PyPy sagt mir auch ehrlich gesagt nicht.

Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.

Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 12:27
von /me
Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
Es gibt ja bekanntlich(?) unterschiedliche Implementierungen von Python. Das von dir verwendete CPython kann als Referenzimplementierung betrachtet werden. PyPyist eine der Alternativen mit einem Fokus auf Performance.

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 12:32
von jbs
Ich denke PyPy wäre zumindest einen Versuch wert. Auch wenn numpypy noch nicht fertig ist, kann man es ja mal ausprobieren.

Solange du keine Funktionalität brauchst die hier aufgelistet ist, könnte es gehen: http://buildbot.pypy.org/numpy-status/latest.html

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 12:38
von jens
Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.
http://wiki.python.de/PyPy

Es ist in manchen Disziplinen um einiges schneller, siehe: http://speed.pypy.org/

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 12:47
von jbs
Arp hat geschrieben:PyPy sagt mir auch ehrlich gesagt nicht.

Ich hab da noch ne Frage. Habt ihr eine Idee wie ich eine Statusbar oder sowas in das parallele einbauen kann? Das einzige was mir einfällt ist anhand der aktuellen x y Koordinate und der Gesamtzahl der Pixel zu ermitteln wie weit man in dem Bild ist, allerdings ist das sehr ungenau da einige Pixel schneller als die anderen fertig sind.

Hier wärs wieder von Vorteil wenn jeder Thread auf eine globale Varibale zugreifen könnte. Könnte einfach an das Ende der Berechnungsfunktion die globale Varibale erhöhen bzw. auslesen und würde dann wissen wieviele Pixel wirklich fertig bearbeitet sind.
Du meinst einen Fortschrittsbalken? Ich denke nicht, dass der sehr genau sein muss. Du willst ja nur wissen wo ungefähr er gerade ist.

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 13:04
von Arp
:)

Naja, aber sollte ja nun prinzipiell nicht schwer sein abzuzählen wieviele Prozesse durchgelaufen sind.

Ich hab da was mit multiprocessing.Value gefunde, aber das klappt nicht ganz.
Hab mir dafür ein kleines Testprogramm geschrieben:

Code: Alles auswählen

from multiprocessing import Pool, Value
import numpy,time

def calc(sleeptime,n):
   time.sleep(sleeptime)
   n.value+=1
   print str(n.value)+' Processes done.'
   return sleeptime

randtimes = numpy.random.randint(10,size=100)
p = Pool(2)
n = Value('i',0)

result = p.map(calc,randtimes,n)
Das sollte, zumindest denke ich das, 2 Prozesse gleichzeitig ausführen, jeder bekommt eine zufällige sleeptime. Wenn die Zeit abgewartet ist, sollte n erhöht werden udn der Ausdruck kommen.

Aber was kriege ist nur eine Fehlermeldung.
unsupported operand type(s) for //: 'int' and 'Synchronized'

Das scheint irgendwie an der Übergabe von n zu liegen. Geht das vielleicht mit p.map nicht?

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 13:22
von snafu
Übrigens, wenn dem Pool kein Argument für die Prozesszahl mitgegeben wird, dann ermittelt er diese Anzahl automatisch aus der Anzahl an Prozessorkernen. Das könnte unter Umständen portabler sein. Außer, es gibt berechtigte Gründe, die dagegen sprechen...

Und was dein Problem angeht: Das dritte (optionale) ist ja die `chunksize`. Da wird wohl eher ein normalen `Int`-Objekt erwartet.

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 13:25
von Arp
Das Programm läuft auf einem Rechner den mehre Kollegen mitbenutzen. Ich will denen nicht gleich alle verfügbaren Kerne "wegnehmen" :)

Nee, ich habs grad gesehen, das Problem war, das es p.map(calc,(randtimes,n)) sein muss. Die Argumente müssen quasi zusammen übergeben werden.

Aber dann kommt ein anderer Fehler.

Synchronized objects should only be shared between processes through inheritance

Wenn das so weiter geht, speicher ich fertige pixelnummern in einer Datei und lade es jedes mal wieder... wär sowas wie eine Globale Variable, nur extrem langsam da ständig von der Platte geladen werden muss :evil:

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 14:14
von Arp
Ok, ich hab eine Lösung, aber die ist etwas blöd.

Und zwar scheint das relativ einfach zu gehen wenn man statt pool multiprocessing.Process benutzt.... kann ich darauf auch map anwenden?

Also ursprünglich stand da ja result = p.map(...). Allergebnisse aller Prozesse wurden nun in result gespeichert, wohl geordnet.
Kann ich das auch mit Process machen?

Re: Parallelprogrammierung?

Verfasst: Dienstag 26. Juni 2012, 14:47
von jbs
Aber hast du mal Lust PyPy auszuprobieren? Es könnte nochmal für einen Performanceschub sorgen.