Отправка и получение данных структурированного массива в MPI4Py с использованием NumPy

Я пытаюсь отправлять и получать данные в MPI4Py, используя структурированный массив из NumPy. Ниже приведена структура моего массива:

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 не может отправлять эти структурированные массивы или я делаю что-то не так?


person dasmaze    schedule 11.07.2012    source источник
comment
Я думаю, что функции типа Sendrecv() могут отправлять массивы Numpy только одного типа. Вы всегда можете использовать sendrecv() (нижний регистр), который может отправлять общие объекты Python, но тогда у вас будут накладные расходы на сериализацию.   -  person Jonathan Dursi    schedule 11.07.2012


Ответы (1)


Как уже упоминал Джонатан Дурси в своем комментарии: подпрограммы связи с заглавной первой буквой (например, Sendrecv()) могут передавать только «буферы памяти», то есть структуры данных, которые предоставляют определенный C API. Структурированные массивы не кажутся такой структурой данных. Чтобы отправить его в любом случае, используйте sendrecv().

См. документацию по MPI4Py по адресу http://mpi4py.scipy.org/docs/usrman/mpi4py.html.

person olenz    schedule 12.07.2012