1
我正在运行使用Python .7.10的Ubuntu 14.04.3系统上针对OpenMPI 1.10.1构建的mpi4py 2.0.0。出于某种原因,尝试发送大于64 Kb的消息会导致send/recv挂起;但是,我可以使用完全相同的软件和OpenMPI/mpi4py软件包在其他Ubuntu 14系统上成功发送大量消息。我也能够在使用OpenMPI的C程序中成功发送大量消息。这表明环境中有某些东西会对mpi4py执行的MPI通信产生不利影响。任何想法可能会干扰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)
我也试过更换与非腌制的SEND/RECV使用明确指定的固定长度的缓冲腌发送/ recv的,但并没有对这个问题有什么影响。
奇怪的是,这个问题似乎没有影响使用相同通信器的对等进程之间的传输。
奇怪。 C代码是否与Python的代码相同,即它是否也使用MPI_Comm_spawn?所有进程是否在同一主机上运行?如果您可以使用GDB附加到每个Python进程并生成主线程的堆栈跟踪,将会有所帮助。 –
虚拟网络接口引起的问题,正如您在其他地方观察到的类似问题所观察到的那样:-) – lebedov