2016-04-07 21 views
0

Wenn ich die ID jedes Kommunikators einer Variablen auflisten möchte, wie könnte ich das tun? Im Folgenden ist ein Versuch, diese Idee zu demonstrieren:mpi4py Wert-ID anhängen, um für jede Communicator Instanz aufzulisten

from mpi4py import MPI 
comm = MPI.COMM_WORLD 

obj = "I am an example. My ID is unique to each communicator." 
mpi_id = 'rank %i has id %s'%(comm.rank, str(id(obj))) 
comm.send(mpi_id, tag=11, dtest=comm.rank) 

mpi_id_list = [] 
for i in range(comm.size): 
    mpi_id_list.append(comm.recv(source=i, tag=11)) 

print mpi_id_list 
+1

Die Frage ist mir nicht klar. Welchen Zweck hat die Datenstruktur, die Sie erstellen möchten? Wie definierst du den Inhalt dieser * Liste *? Sollte die Liste auf jedem Rang gleich sein? Anders? Nur auf Meister? Auch Ihr Beispiel Code posts mehr 'recv' als 'send', so kann es nicht funktionieren. – Zulan

+0

Ja, ich bin mir nicht sicher, wie man eine funktionierende Version implementiert. Die Python-'id'-Funktion zeigt die Kennung an, die mit einem Objekt verknüpft ist. Objekte haben immer die gleiche ID auf dem Communicator, aber die ID-Nummer ist auf jedem Communicator unterschiedlich. Ich möchte eine Liste der ID, die mit einem Objekt für jeden Kommunikator verbunden ist. Der Code funktioniert bis zur Zuweisung von 'mpi_id', welches die Form ist, die ich für jeden Listeneintrag haben möchte, – kilojoules

+0

Ich denke, du verwechselst _MPI rangiert/processes_ für _communicators_. Letztere sind die logischen Kontexte, in denen MPI-Kommunikationen stattfinden, während die ersteren die eigentlichen kommunizierenden Einheiten sind. –

Antwort

1

In MPI sollte jeder comm.send(...,dest=x) durch einen durch den Prozess der Rang x ausgeführt comm.recv(...) angepasst werden. Alle Nachrichten können an den Prozess von Rang 0 gesendet werden und der Prozess 0 muss alle diese Nachrichten empfangen. Diese Operation ist eine kollektive Operation, die Reduktion genannt wird.

Der folgende Code kann comm.bcast() Verwendung des kollektiven Betrieb mpirun -np 4 main.py

from mpi4py import MPI 
comm = MPI.COMM_WORLD 

obj = "I am an example. My ID is unique to each communicator." 
mpi_id = 'rank %i has id %s'%(comm.rank, str(id(obj))) 
comm.send(mpi_id, tag=11, dest=0) 

mpi_id_list = [] 
if comm.rank==0: 
    mpi_id_list = [] 
    for i in range(comm.size): 
     mpi_id_list.append(comm.recv(source=i, tag=11)) 

    print mpi_id_list 

#broadcasting the list 
mpi_id_list = comm.bcast(mpi_id_list, root=0) 

#now, the list is the same on all processes. 
print "rank "+str(comm.rank)+" has list "+str(mpi_id_list) 

Beachten Sie, dass dieses Beispiel macht, indem Sie auf 4 Prozesse ausgeführt werden, um die sich ergebende Liste an alle Prozesse zu übertragen. Beispiele für verschiedene Sammelvorgänge finden Sie unter https://mpi4py.scipy.org/docs/usrman/tutorial.html für mpi4py. Zum Beispiel, Sie werden durch die comm.allreduce() Operation versucht: