MPI4PY - Могу ли я предсказать размер заполнения?

Рассмотрим следующую программу, которая предоставляет один байт для заполнения, чего недостаточно.

import pickle
from mpi4py import MPI


s = ''
f = pickle.dumps(s)
print(len(f))
w = MPI.COMM_WORLD.irecv(len(f)+1)
MPI.COMM_WORLD.send(f, dest=0)
f = w.wait()
print(len(f))

Это дает:

Traceback (most recent call last):
  File "...", line 10, in <module>
    f = w.wait()
  File "mpi4py/MPI\Request.pyx", line 235, in mpi4py.MPI.Request.wait
  File "mpi4py/MPI\msgpickle.pxi", line 411, in mpi4py.MPI.PyMPI_wait
mpi4py.MPI.Exception: Message truncated, error stack:
MPI_Wait(request=0x000001C6A3EC78D8, status0x00000073023EF3A0) failed
Message truncated; 11 bytes received but buffer size is 11

Как я могу узнать, сколько еще нужно добавить к сообщению, чтобы передача гарантированно прошла успешно?


person Carbon    schedule 27.07.2020    source источник


Ответы (1)


Если вы вызовете функцию нижнего регистра без аргументов, вы получите буфер по умолчанию размером 32 КБ.

w = MPI.COMM_WORLD.irecv()

Если вы хотите указать размер буфера, вам нужно передать объект буфера в качестве аргумента с правильным размером. В вашем коде вы указываете только целое число в качестве буфера.

Также в этом случае, поскольку вы используете версии в нижнем регистре, пакет mpi4py соберет ваши данные, что сделает их длиннее. Вы должны были бы написать что-то вроде следующего:

recvbuf = bytearray(b' ' * len(pickle.dumps(f)))
w = MPI.COMM_WORLD.irecv(buf=recvbuf)

Однако, если вы хотите указать длину своих данных, я бы рекомендовал изучить реализации функций в верхнем регистре и использовать массивы numpy. Это показано в документах здесь.

person mpw2    schedule 30.07.2020
comment
У этого есть ограничение - 32k по умолчанию. - person Carbon; 31.07.2020