我有一个相当简单的 MPI 程序,本质上是“初始化,2 次从主机发送到从机,2 次在从机上接收,执行一系列系统调用以复制/粘贴然后运行代码,整理并完成 mpi”。
这看起来很简单,但我没有让 mpi_finalize 正常工作。下面是程序的快照,没有我在“do codish stuff”类型语句中汇总的所有系统复制/粘贴/调用外部代码。
program mpi_finalize_break
!<variable declarations>
call MPI_INIT(ierr)
icomm = MPI_COMM_WORLD
call MPI_COMM_SIZE(icomm,nproc,ierr)
call MPI_COMM_RANK(icomm,rank,ierr)
!<do codish stuff for a while>
if (rank == 0) then
!<set up some stuff then call MPI_SEND in a loop over number of slaves>
call MPI_SEND(numat,1,MPI_INTEGER,n,0,icomm,ierr)
call MPI_SEND(n_to_add,1,MPI_INTEGER,n,0,icomm,ierr)
else
call MPI_Recv(begin_mat,1,MPI_INTEGER,0,0,icomm,status,ierr)
call MPI_Recv(nrepeat,1,MPI_INTEGER,0,0,icomm,status,ierr)
!<do codish stuff for a while>
endif
print*, "got here4", rank
call MPI_BARRIER(icomm,ierr)
print*, "got here5", rank, ierr
call MPI_FINALIZE(ierr)
print*, "got here6"
end program mpi_finalize_break
现在我看到的问题发生在“got here4”、“got here5”和“got here6”语句周围。我得到了适当数量的打印语句,以及“got here4”和“got here5”的相应等级。意思是,主服务器和所有从服务器(等级 0,以及所有其他等级)通过屏障调用和 MPI_FINALIZE 到达屏障调用,并在所有这些上报告 0 表示 ierr。但是,当它到达“到达这里6”时,在 MPI_FINALIZE 之后我会得到各种奇怪的行为。有时我会比我预期的少一个“到这里6”,或者有时我会少6个,但是程序永远挂起,永远不会关闭,并在一个(或多个)计算节点上留下一个孤立的进程。
我在 infiniband 骨干机器上运行它,NFS 服务器通过 infiniband (nfs-rdma) 共享。我正在尝试确定 MPI_BARRIER 调用如何正常工作,但 MPI_FINALIZE 最终以随机孤立运行(不是同一个节点,也不是每次相同数量的孤立运行)。我猜它与对 cp、mv、./run_some_code、cp、mv 的各种系统调用有关,但不确定它是否也与 infiniband 的速度有关,因为这一切都发生得相当快。我也可能有错误的直觉。有人有想法吗?如果有帮助,我可以放置整个代码,但我相信这个浓缩版本可以捕捉到它。我正在运行针对 ifort 15.0.2 编译的 openmpi1.8.4,Mellanox 适配器运行固件 2.9.1000。
谢谢您的帮助。
更新:
根据请求,我将“MPI_Abort”放入并获得以下信息:
forrtl: error (78): process killed (SIGTERM)
Image PC Routine Line Source
pburn 0000000000438CB1 Unknown Unknown Unknown
pburn 0000000000437407 Unknown Unknown Unknown
libmpi_usempif08. 00002B5BCB5C5712 Unknown Unknown Unknown
libmpi_usempif08. 00002B5BCB5C5566 Unknown Unknown Unknown
libmpi_usempif08. 00002B5BCB5B3DCC Unknown Unknown Unknown
libmpi_usempif08. 00002B5BCB594F63 Unknown Unknown Unknown
libpthread.so.0 000000345C00F710 Unknown Unknown Unknown
libc.so.6 000000345B8DB2ED Unknown Unknown Unknown
libc.so.6 000000345B872AEF Unknown Unknown Unknown
libc.so.6 000000345B866F26 Unknown Unknown Unknown
libopen-pal.so.6 00002B5BCC313EB2 Unknown Unknown Unknown
libopen-rte.so.7 00002B5BCC0416FE Unknown Unknown Unknown
libmpi.so.1 00002B5BCBD539DF Unknown Unknown Unknown
libmpi_mpifh.so.2 00002B5BCBADCF5A Unknown Unknown Unknown
pburn 0000000000416889 MAIN__ 415 parallel_burn.f90
pburn 00000000004043DE Unknown Unknown Unknown
libc.so.6 000000345B81ED5D Unknown Unknown Unknown
pburn 00000000004042E9 Unknown Unknown Unknown
但是代码运行正常,否则(所有正确的输出文件和东西)。