2015-11-11 55 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