Не может отправлять сообщения MPI определенной длины
Я использую mpi4py 2.0.0, построенную на OpenMPI 1.10.1 в системе Ubuntu 14.04.3 с Python .7.10. По какой-то причине попытка отправки сообщений размером более 64 Кб приводит к зависанию команды send/recv; Тем не менее, я могу успешно отправлять большие сообщения в других системах Ubuntu 14, используя точно такое же программное обеспечение и пакеты OpenMPI/mpi4py. Я также могу успешно отправлять большие сообщения в программах C, которые используют OpenMPI. Это говорит о том, что в среде есть что-то, что негативно влияет на связь MPI, выполняемую mpi4py. Любые идеи относительно того, что может мешать mpi4py?
Вот пример кода, который работает в одной системе и зависает в другой, когда N установлено на 65537 или выше.
import os
import sys
from mpi4py import MPI
import numpy as np
N = 65537
def worker():
comm = MPI.Comm.Get_parent()
size = comm.Get_size()
rank = comm.Get_rank()
buf = np.empty(N, np.byte)
comm.Recv(buf=buf)
if __name__ == '__main__':
script_file_name = os.path.basename(__file__)
if MPI.Comm.Get_parent() != MPI.COMM_NULL:
worker()
else:
comm = MPI.COMM_SELF.Spawn(sys.executable,
args=[script_file_name],
maxprocs=1)
comm.Send(np.random.randint(0, 256, N).astype(np.byte), 0)
Я также попытался заменить маринованный send/recv на не маринованный Send/Recv, используя явно указанные буферы фиксированной длины, но это никак не повлияло на проблему.
Любопытно, что проблема не влияет на передачу между одноранговыми процессами, использующими один и тот же коммуникатор.
1 ответ
Проблема решена: OpenMPI смутился из-за наличия виртуального сетевого интерфейса, созданного Docker. Удаление интерфейса убрало странность, хотя можно также сказать OpenMPI игнорировать интерфейс.