基本的に「初期化、マスターからスレーブへの2回の送信、スレーブでの2回の受信、コピー/貼り付けのための一連のシステムコールの実行、コードの整理、mpiファイナライズ」というかなり単純な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 に到達し、それらすべての ierr に対して 0 を報告しました。しかし、"got here6" になると、MPI_FINALIZE の後で、あらゆる種類の奇妙な動作が発生します。「got here6」が予想よりも 1 つ少ない場合もあれば、6 つ少ない場合もありますが、プログラムは永久にハングアップし、1 つ (または複数) の計算ノードに孤立したプロセスが残ります。
NFSサーバーがインフィニバンド(nfs-rdma)で共有されているインフィニバンドバックボーンマシンでこれを実行しています。MPI_BARRIER 呼び出しがどのように正常に機能するかを判断しようとしていますが、MPI_FINALIZE はランダムな孤立した実行になります (同じノードでも、毎回同じ数の孤立したものでもありません)。cp、mv、./run_some_code、cp、mv へのさまざまなシステム コールに関連していると推測していますが、これらすべてがかなり迅速に発生するため、infiniband の速度にも関連している可能性があるかどうかはわかりませんでした。私も間違った直感を持っている可能性があります。考えている人はいますか?参考になればコード全体を掲載することもできますが、この要約版はそれを捉えていると思います。ファームウェア 2.9.1000 を実行する Mellanox アダプターを使用して、 ifort 15.0.2 に対してコンパイルされた openmpi1.8.4 を実行しています。
助けてくれてありがとう。
アップデート:
リクエストごとに、「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
ただし、コードはそれ以外の場合は正しく実行されます (すべての正しい出力ファイルともの)。