Я запускаю 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?не может отправлять сообщения MPI на определенную длину
Ниже приведен пример кода, который работает в одной системе и зависает на другом, когда 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)
Я также попытался заменить маринованные посыла/ПРИЕМ с не маринованные отправки/ПРИЕМ с помощью явно заданных буферов фиксированной длины, но это не оказывает никакого влияния на эту проблему.
Любопытно, что проблема не влияет на передачи между одноранговыми процессами с использованием одного и того же коммуникатора.
Странно. Является ли код C, который работает эквивалентно Python, т. Е. Использует ли он MPI_Comm_spawn? Все процессы работают на одном хосте? Это поможет, если вы можете подключиться к каждому процессу Python с помощью GDB и создать трассировку стека основного потока. –
Проблема, вызванная виртуальным сетевым интерфейсом, как вы заметили в ответ на аналогичную проблему в другом месте на SO :-) – lebedov