0

基本的に「初期化、マスターからスレーブへの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」、「g​​ot 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

ただし、コードはそれ以外の場合は正しく実行されます (すべての正しい出力ファイルともの)。

4

1 に答える 1