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