2015-04-22 43 views
0

我有一個相當直接的MPI程序,本質上是「初始化,2從主機發送到從機,2從機接收,做一堆系統調用複製/粘貼然後運行代碼,整理和mpi最終確定「。MPI_Finalize行爲不正常,孤立進程

這看起來很直接,但我沒有讓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」語句周圍。我得到了適當數量的打印語句和相應的排名,以獲得「here4」以及「got here5」。意思是,主人和所有奴隸(等級0和所有其他等級)通過障礙呼叫和MPI_FINALIZE進入障礙呼叫,爲所有人報告0。但是,當它到達「here6」時,在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 

但該代碼可以正常運行,否則(所有正確的輸出文件和事情)。

+0

你報告給OpenMPI用戶列表嗎? – Jeff

+0

我沒有,因爲我第一次認爲我是問題,但我越調查越有意義,所以我也會在那裏發帖。 – jackd

+0

從技術上講,MPI不能保證「MPI_Finalize」之後有多少進程存在,但每個羣集實現的數目與以前相同。我不確定Fortran中的IO flush語義是什麼(即使我使用Fortran很多,它的代碼中有它自己的包裝C的flush例程),所以我不會使用'got here6'作爲診斷。但是,如果您發現'MPI_Finalize'之後不存在所有進程,那顯然是一個問題。如果用'MPI_Abort(MPI_COMM_WORLD,0)'替換'MPI_Finalize()',會發生什麼? – Jeff

回答

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. 
-------------------------------------