我有一个相当简单的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
但代码正确运行(所有正确的输出文件和东西)。
答案 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.
-------------------------------------