2015-11-11 30 views
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的,但并没有对这个问题有什么影响。

奇怪的是,这个问题似乎没有影响使用相同通信器的对等进程之间的传输。

+0

奇怪。 C代码是否与Python的代码相同,即它是否也使用MPI_Comm_spawn?所有进程是否在同一主机上运行?如果您可以使用GDB附加到每个Python进程并生成主线程的堆栈跟踪,将会有所帮助。 –

+0

虚拟网络接口引起的问题,正如您在其他地方观察到的类似问题所观察到的那样:-) – lebedov

回答

1

问题解决:OpenMPI被Docker创建的虚拟网络接口所困惑。删除界面使怪异消失,但也可以将OpenMPI告知ignore the interface