MPI_Finalize表现不正常,孤立的进程

时间:2015-04-22 20:55:01

标签: fortran mpi intel openmpi infiniband

我有一个相当简单的MPI程序,基本上"初始化,2个从主服务器发送到从服务器,2个从服务器接收,执行一系列系统调用以复制/粘贴然后运行代码,整理和mpi敲定"。

这看起来很简单,但我没有让mpi_finalize正常工作。下面是程序的快照,没有我已经卷起的所有系统复制/粘贴/调用外部代码"做了编码的东西"类型陈述。

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

现在我看到的问题发生在&#34;得到了这里4&#34;,&#34;得到了这里5&#34;和#34;来到这里6&#34;声明。我得到了相应数量的印刷语句,其中#34;得到了#4;#34;以及#34;得到了这里#5和#34;。意思是,主人和所有奴隶(等级0,以及所有其他等级)通过屏障调用和MPI_FINALIZE进入屏障调用,在所有人身上为ierr报告0。然而,当它到达这里时,在MPI_FINALIZE之后,我会得到各种奇怪的行为。有时候我会少一点,然后到这里来#6;#34;比我预期的要好,或者有时我会减少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。

感谢您的帮助。

更新

根据请求,我把&#34; MPI_Abort&#34; in并获得以下内容:

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

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

1 个答案:

答案 0 :(得分:0)

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

您的问题也可能来自您的&#34;复制/粘贴/调用外部代码&#34;如果某处有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.
-------------------------------------
相关问题