MPI_FINALIZE()
Fortran90プログラムでの呼び出し中にセグメンテーション違反が発生します。コードは非常に広範囲ですが、擬似コードを投稿して、フラグが発生するかどうかを確認します。配列の割り当てを解除しないことが原因である可能性があるという予感があります(ただし、まだこれを試していません) 。ただし、よくわかりません。Fortran90で配列の割り当てを解除できないと、呼び出し中にセグメンテーション違反が発生する可能性がありMPI_FINALIZE
ますか?
if(<rank 0>) then
do iat = 1,natoms
do il = 0, LMAX
do im = -il,il
<mpi_recv "rank_rdy"> ! find out which rank is ready for (at,l,m)
<mpi_send "(iat,il,im)"> ! send (at,l,m) to the rank asking for it
enddo
enddo
enddo
else ! other ranks send a 'ready' signal and recieve the (at,l,m) to optimize
if(<rank 0 is not finished processing (at,l,m)'s>)
<mpi_send "my_rank"> ! tell rank 0 that i am ready to receive
<mpi_recv "(iat,il,im)"> ! recieve (at,l,m) from rank 0
call optimize(iat,il,im) ! do work on (at,l,m)
endif
endif
if(<rank 0>)
<read temp files created by other ranks>
<write temp files to one master file>
endif
print*, 'calling finalize'
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
call MPI_FINALIZE()
出力時に、この問題に関係のない他の情報の中でも、次の情報が得られます。
calling finalize
calling finalize
calling finalize
calling finalize
calling finalize
calling finalize
=====================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 11
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
電話をかけなくても同じ問題が発生しますMPI_BARRIER
が、それが役立つかもしれないと思いました。すべてのランクで使用されている配列がありますが、プログラム全体で使用しているため、メモリリークなどの心配がないため、割り当てを解除する必要はありません。MPI_FINALIZE()
メモリを解放せずに呼び出されたために、このセグメンテーション違反が発生している可能性はありますか?
私はこれを自分でもっと探求するつもりですが、いくつかの理由でこの質問を投稿したいと思いました:
電話をかけるときにこれが既知の問題であるかどうかを知りたい
MPI_FINALIZE()
を呼び出すときに、なぜこれが発生するのか(実際に問題がある場合)を知りたい
MPI_FINALIZE()
。内部的には、このセグメンテーション違反の原因は何ですか?私はオンラインで高低を検索しましたが、この問題については何も見つかりませんでした。したがって、後世のために、これはWebで答えるのに良い質問かもしれません。
編集:これについて言及するのを忘れましたが、シリアルで実行するとこの問題を再現できません。(at,l,m)
もちろん、私はシリアルでの配布はしていません。唯一のプロセスは、すべての組み合わせを実行し、それらを1つずつ最適化するだけです。ただし、MPIで問題を引き起こしている可能性があると思われるアレイの割り当てを解除しません。それでも、セグメンテーション違反は発生しません。