Я пытаюсь отправить одно комплексное число, используя реализацию MPI (MPI4py) в Python от одного отправителя к одному получателю.Вот код:
from mpi4py import MPI
import numpy as np
comm = MPI.COMM_WORLD
if comm.rank == 0:
print("I am sender")
a = np.matrix('5+1j')
req = [None]
#Send message with a predefined tag, like 15, to rank 1
req = comm.Isend([a, MPI.COMPLEX], dest=1, tag=15)
MPI.Request.Wait(req)
print("Sender sent: ")
print(a[0])
else:
print("I am receiver")
A = np.empty_like(np.matrix([[0]*(1) for i in range(1)]))
print("point 1")
#Receive message with tag 15 from rank 0
rA = comm.Irecv(A, source=0, tag=15)
rA.wait()
print("Receiver received: ")
print(A)
Обратите внимание, что приведенный выше пример является упрощенной версией моей цели, которая заключается в отправке массива numpy
(или матрицы numpy
) множества сложных записей от одного отправителя.к нескольким получателям.Вот почему я использую неблокирующую отправку Comm::Isend()
и получение Comm::Irecv()
вместе с Request::Wait()
в этом примере.Однако в общем случае у меня будет один Comm::Isend()
на итерацию цикла for и Request::Waitall()
для вектора запросов, по одному для каждого получателя в целом.
Для вышеуказанной программы созданные процессы MPI простодва, один отправитель и один получатель.Также моя установка MPI4py 3.0.0.и использует Python 2.7.14 и ядро Open MPI 2.1.2.
Теперь программа вылетает на
rA.wait()
со следующей ошибкой
mpi4py.MPI.Exception: MPI_ERR_TRUNCATE: сообщение усечено
, что на основе оперативного поиска означает, что буфера получателя недостаточно для хранения полученных данных, то есть комплексного числа, ноЯ не понимаю почему.