J'utilise mpi4py pour paralléliser mon code. Je veux communiquer deux morceaux de données, un nombre entier et un nombre réel, entre les noeuds. Je voudrais également utiliser des tableaux et les fonctions Send
et Recv
qui sont plus rapides. En lisant quelques tutoriels, il semble que cela devrait être possible, mais je ne trouve aucun exemple. Voici une version simple de ce qui ne fonctionne pas:Comment créer une structure pour passer entre les nœuds en utilisant 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)
Et l'erreur:
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:}'
Je pense que cela signifie qu'il ne suffit pas d'utiliser un tableau structuré de numpy, et je dois utiliser un type de données MPI. J'ai trouvé sur la documentation (https://mpi4py.scipy.org/docs/apiref/mpi4py.MPI.Datatype-class.html) qu'il y a une fonction mpi4py.MPI.Datatype.Create_struct
, qui semble être ce que je veux, mais je ne comprends pas comment l'utiliser. La chaîne de doc dit:
Create_struct(...)
Datatype.Create_struct(type cls, blocklengths, displacements, datatypes)
Create an datatype from a general set of
block sizes, displacements and datatypes
Merci pour toute aide!