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

问题描述 投票:5回答:1

我正在尝试使用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:}'

当使用仅具有一种数据类型(例如,所有字节)的数组时,它起作用。 MPI4Py是否无法发送这些结构化数组,还是我做错了?

python numpy mpi mpi4py
1个回答
3
投票

[正如乔纳森·杜尔西(Jonathan Dursi)在其评论中已经提到的:以大写首字母表示的通信例程(例如Sendrecv())只能通信“内存缓冲区”,即提供特定C API的数据结构。结构化数组似乎不是这样的数据结构。无论如何要发送它,请使用sendrecv()

请参见http://mpi4py.scipy.org/docs/usrman/mpi4py.html的MPI4Py文档。

© www.soinside.com 2019 - 2024. All rights reserved.