【问题标题】:MPI_Finalize not behaving correctly, orphaned processesMPI_Finalize 行为不正确,孤立进程
【发布时间】:2015-06-30 18:19:45
【问题描述】:

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

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

【问题讨论】:

  • 你向 OpenMPI 用户列表报告了吗?
  • 我并没有像我最初认为的那样是问题所在,但我调查得越多,它就越没有意义,所以我也会在那里发帖。
  • 所以从技术上讲,MPI 不能保证MPI_Finalize 之后存在多少进程,但是集群的每个实现都将具有与之前相同的数量。我不确定 Fortran 中的 IO 刷新语义是什么(即使我大量使用 Fortran,但它是在一个包含 C 的自己的刷新例程的代码中),所以我不会使用 got here6 作为诊断。但是,如果您发现MPI_Finalize 之后并非所有进程都存在,那显然是个问题。如果将MPI_Finalize() 替换为MPI_Abort(MPI_COMM_WORLD,0) 会发生什么?

标签: fortran mpi intel openmpi infiniband


【解决方案1】:

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

如果某处有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.
-------------------------------------

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2016-06-06
    • 1970-01-01
    相关资源
    最近更新 更多