Python 使用NumPy在MPI4Py中发送和接收结构化数组数据

Python 使用NumPy在MPI4Py中发送和接收结构化数组数据,python,numpy,mpi,mpi4py,Python,Numpy,Mpi,Mpi4py,我正在尝试使用NumPy的结构化数组在MPI4Py中发送和接收数据。以下是我的数组结构: numpy.zeros(FILE_LINES, dtype='i4,54b') 我使用Sendrecv方法交换数据,如下所示: comm.Sendrecv(data_send, dest=partner_rank, sendtag=data_tag, \ recvbuf=data_receive, source=partner_rank, recvtag=data_tag, status=

我正在尝试使用NumPy的结构化数组在MPI4Py中发送和接收数据。以下是我的数组结构:

numpy.zeros(FILE_LINES, dtype='i4,54b')
我使用Sendrecv方法交换数据,如下所示:

comm.Sendrecv(data_send, dest=partner_rank, sendtag=data_tag, \
        recvbuf=data_receive, source=partner_rank, recvtag=data_tag, status=None)
但是当调用通信方法时,我得到一个异常:

Traceback (most recent call last):
  File "bipy.py", line 91, in <module>
  bitonic_sort()
File "bipy.py", line 72, in bitonic_sort
  bitonic_merge(i, ixj, (i & k) == 0)
File "bipy.py", line 51, in bitonic_merge
  recvbuf=data_receive, source=partner_rank, recvtag=data_tag, status=None)
File "Comm.pyx", line 166, in mpi4py.MPI.Comm.Sendrecv (src/mpi4py.MPI.c:58898)
File "message.pxi", line 318, in mpi4py.MPI.message_p2p_send (src/mpi4py.MPI.c:21422)
File "message.pxi", line 301, in mpi4py.MPI._p_msg_p2p.for_send (src/mpi4py.MPI.c:21285)
File "message.pxi", line 111, in mpi4py.MPI.message_simple (src/mpi4py.MPI.c:19256)
File "message.pxi", line 58, in mpi4py.MPI.message_basic (src/mpi4py.MPI.c:18509)
KeyError: 'T{=l:f0:(54)b:f1:}'
回溯(最近一次呼叫最后一次):
文件“bipy.py”,第91行,在
双音_排序()
文件“bipy.py”,第72行,按二进制排序
双音合并(i,ixj,(i&k)==0)
文件“bipy.py”,第51行,在bitonic_merge中
recvbuf=数据\接收,源=合作伙伴\排名,recvtag=数据\标记,状态=无)
文件“Comm.pyx”,第166行,在mpi4py.MPI.Comm.Sendrecv(src/mpi4py.MPI.c:58898)中
文件“message.pxi”,第318行,在mpi4py.MPI.message\u p2p\u send(src/mpi4py.MPI.c:21422)中
文件“message.pxi”,第301行,在mpi4py.MPI.\u p\u msg\u p2p.for\u send中(src/mpi4py.MPI.c:21285)
mpi4py.MPI.message_simple(src/mpi4py.MPI.c:19256)中的文件“message.pxi”,第111行
mpi4py.MPI.message_basic(src/mpi4py.MPI.c:18509)中第58行的文件“message.pxi”
KeyError:'T{=l:f0:(54)b:f1:}'

当使用只有一种数据类型(例如,所有字节)的数组时,它会起作用。MPI4Py是不能发送这些结构化数组,还是我做错了什么?

正如Jonathan Dursi在他的评论中所提到的:带有大写字母首字母的通信例程(例如
Sendrecv()
)只能通信“内存缓冲区”,即提供特定C API的数据结构。结构化数组似乎不是这样的数据结构。 要发送它,请使用
sendrecv()

请参阅MPI4Py文档中的。

我认为Sendrecv()类型函数只能发送单一类型的Numpy数组。您可以始终使用sendrecv()(小写),它可以发送一般的python对象,但这样会产生序列化开销。