Ich verwende MPI4PY, um meinen Code zu parallelisieren. Ich möchte zwei Datenstücke, eine ganze Zahl und eine reelle Zahl, zwischen Knoten kommunizieren. Ich möchte auch Arrays und die Kapital Send
und Recv
Funktionen verwenden, die schneller sind. Wenn ich ein paar Tutorials lese, scheint es möglich zu sein, aber ich kann keine Beispiele finden. Hier ist eine einfache Version von dem, was nicht funktioniert hat:So erstellen Sie eine Struktur für die Weitergabe zwischen Knoten mit mpi4py
import numpy
from mpi4py import MPI
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
dt = numpy.dtype('int,float')
if rank == 0:
recvBuffr = numpy.zeros(1,dt)
comm.Recv(recvBuffr, source = MPI.ANY_SOURCE)
print recvBuffr
else:
result = rank*1.5
sendBuffr = numpy.zeros(1,dt)
sendBuffr[0][0] = rank
sendBuffr[0][1] = result
comm.Send(sendBuffr, dest=0)
Und der Fehler:
Traceback (most recent call last):
File "mpitest.py", line 10, in <module>
Traceback (most recent call last):
File "mpitest.py", line 18, in <module>
comm.Send(sendBuffr, dest=0)
comm.Recv(recvBuffr, source = MPI.ANY_SOURCE)
File "MPI/Comm.pyx", line 248, in mpi4py.MPI.Comm.Recv (src/mpi4py.MPI.c:78963)
File "MPI/Comm.pyx", line 237, in mpi4py.MPI.Comm.Send (src/mpi4py.MPI.c:78765)
File "MPI/msgbuffer.pxi", line 380, in mpi4py.MPI.message_p2p_recv (src/mpi4py.MPI.c:26730)
File "MPI/msgbuffer.pxi", line 366, in mpi4py.MPI._p_msg_p2p.for_recv (src/mpi4py.MPI.c:26575)
File "MPI/msgbuffer.pxi", line 375, in mpi4py.MPI.message_p2p_send (src/mpi4py.MPI.c:26653)
File "MPI/msgbuffer.pxi", line 358, in mpi4py.MPI._p_msg_p2p.for_send (src/mpi4py.MPI.c:26515)
File "MPI/msgbuffer.pxi", line 114, in mpi4py.MPI.message_simple (src/mpi4py.MPI.c:23528)
File "MPI/msgbuffer.pxi", line 114, in mpi4py.MPI.message_simple (src/mpi4py.MPI.c:23528)
File "MPI/msgbuffer.pxi", line 59, in mpi4py.MPI.message_basic (src/mpi4py.MPI.c:22718)
KeyError: 'T{l:f0:d:f1:}'
File "MPI/msgbuffer.pxi", line 59, in mpi4py.MPI.message_basic (src/mpi4py.MPI.c:22718)
KeyError: 'T{l:f0:d:f1:}'
Ich denke, dass dies bedeutet, dass es nicht genug ist, eine numpy strukturierte Anordnung zu verwenden, und ich muß Verwenden Sie einen MPI-Datentyp. Ich fand in der Dokumentation(), dass es eine Funktion mpi4py.MPI.Datatype.Create_struct
gibt, die aussieht, als ob es sein könnte, was ich will, aber ich verstehe nicht, wie man es benutzt. Die Doc-Zeichenfolge lautet:
Create_struct(...)
Datatype.Create_struct(type cls, blocklengths, displacements, datatypes)
Create an datatype from a general set of
block sizes, displacements and datatypes
Vielen Dank für jede Hilfe!