Я пытаюсь отправить одно комплексное число, используя реализацию Python MPI (MPI4py) от одного отправителя к одному получателю. Вот код:
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: сообщение усечено
что на основе поиска в Интернете означает, что буфера приемника недостаточно для хранения полученных данных, то есть комплексного числа, но я не понимаю, почему.