0

我有一个相当简单的 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

但是代码运行正常,否则(所有正确的输出文件和东西)。

4

1 回答 1

0

(这更像是一个评论而不是一个答案,但我需要空间来放置错误消息......)

如果有某个地方,您的问题也可能来自您的“复制/粘贴/调用外部代码” call system。使用 OpenMPI,禁止分叉进程。你会收到一个警告:

--------------------------------------
An MPI process has executed an operation involving a call to the
"fork()" system call to create a child process. Open MPI is currently
operating in a condition that could result in memory corruption or
other system errors; your MPI job may hang, crash, or produce silent
data corruption. The use of fork() (or system() or other calls that
create child processes) is strongly discouraged.
-------------------------------------
于 2015-04-22T22:53:46.457 回答