Я использую mpi4py для распараллеливания моего кода. Я хочу передать две части данных, целое число и реальное число между узлами. Я также хотел бы использовать массивы и капитал Send
и Recv
функции, которые быстрее. Читая некоторые уроки, кажется, что это можно сделать, но я не могу найти примеров. Вот простой вариант того, что не работает:Как создать структуру для передачи между узлами с помощью 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)
И ошибка:
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:}'
Я думаю, что это означает, что это не достаточно, чтобы использовать Numpy структурированный массив, и мне нужно используйте тип данных MPI. Я нашел в документации (https://mpi4py.scipy.org/docs/apiref/mpi4py.MPI.Datatype-class.html), что есть функция mpi4py.MPI.Datatype.Create_struct
, которая выглядит так, как будто это может быть то, что я хочу, но я не понимаю, как ее использовать. В колонке док говорится:
Create_struct(...)
Datatype.Create_struct(type cls, blocklengths, displacements, datatypes)
Create an datatype from a general set of
block sizes, displacements and datatypes
Спасибо за помощь!