我有一個相當直接的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
但該代碼可以正常運行,否則(所有正確的輸出文件和事情)。
你報告給OpenMPI用戶列表嗎? – Jeff
我沒有,因爲我第一次認爲我是問題,但我越調查越有意義,所以我也會在那裏發帖。 – jackd
從技術上講,MPI不能保證「MPI_Finalize」之後有多少進程存在,但每個羣集實現的數目與以前相同。我不確定Fortran中的IO flush語義是什麼(即使我使用Fortran很多,它的代碼中有它自己的包裝C的flush例程),所以我不會使用'got here6'作爲診斷。但是,如果您發現'MPI_Finalize'之後不存在所有進程,那顯然是一個問題。如果用'MPI_Abort(MPI_COMM_WORLD,0)'替換'MPI_Finalize()',會發生什麼? – Jeff