Python multiprocessing innerhalb mpi

Habe ich ein python-script, dass ich geschrieben habe, mit dem multiprocessing-Modul für eine schnellere Ausführung. Die Berechnung ist peinlich parallel, so dass die Effizienz skaliert mit der Anzahl der Prozessoren. Jetzt würde ich gerne diese in ein MPI-Programm, das die Verwaltung einer MCMC Berechnungen auf mehreren Computern. Dieser code hat ein Aufruf von system (), die unter Berufung auf das python-Skript. Aber ich finde, dass, wenn es so genannt, die den Effizienzgewinn aus der Verwendung von python-multiprocessing verschwindet.

Wie kann ich mein python-Skript zu behalten, die Geschwindigkeit Gewinne aus multiprocessing beim Aufruf von MPI?

Hier ist ein einfaches Beispiel, das Analog zu den viel komplizierteren codes, die ich verwenden möchten, zeigt jedoch die gleiche Allgemeine Verhalten. Ich Schreibe ein ausführbares python-Skript namens junk.py.

#!/usr/bin/python
import multiprocessing
import numpy as np

nproc = 3
nlen = 100000


def f(x):
    print x
    v = np.arange(nlen)
    result = 0.
    for i, y in enumerate(v):
        result += (x+v[i:]).sum()
    return result


def foo():
    pool = multiprocessing.Pool(processes=nproc)
    xlist = range(2,2+nproc)
    print xlist
    result = pool.map(f, xlist)
    print result

if __name__ == '__main__':
    foo()

Wenn ich von der shell aus durch sich selbst, mit "top" kann ich sehen, drei python-Prozesse, die jeweils 100% der cpu, auf meine 16-core-Maschine.

node094:mpi[ 206 ] /usr/bin/time junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
62.68user 0.04system 0:21.11elapsed 297%CPU (0avgtext+0avgdata 16516maxresident)k
0inputs+0outputs (0major+11092minor)pagefaults 0swaps

Allerdings, wenn ich rufe diese mit mpirun, jedes python-Prozeß nimmt 33% der cpu, und insgesamt dauert es etwa drei mal so lange laufen. Aufruf mit -np 2 oder mehr Ergebnisse in weitere Prozesse, aber nicht die Geschwindigkeit, bis die Berechnung keine.

node094:mpi[ 208 ] /usr/bin/time mpirun -np 1 junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
61.63user 0.07system 1:01.91elapsed 99%CPU (0avgtext+0avgdata 16520maxresident)k
0inputs+8outputs (0major+13715minor)pagefaults 0swaps

(Zusätzliche Hinweise: Dies ist mpirun 1.8.1, python 2.7.3 unter Linux Debian-version wheezy. Ich habe gehört system() ist nicht immer erlaubt, innerhalb von MPI-Programmen, aber es arbeitet für mich für die letzten fünf Jahre auf diesem computer. Zum Beispiel habe ich genannt pthread-based parallel code von system() in einem MPI-Programm, und es ist verwendet 100% der cpu für jeden thread, wie gewünscht. Auch in Fall, dass Sie im Begriff waren, zu suggerieren, läuft das python-Skript in serieller und nur ruft es auf mehr Knoten...der MCMC Berechnung beinhaltet eine Feste Anzahl von Ketten, die Notwendigkeit sich zu bewegen in einer synchronisierten Art und Weise, so die Berechnung, leider kann nicht neu organisiert werden, dass Art und Weise.)

Schreibe einen Kommentar