4

どうやら、mpirun生成された各プロセスに SIGINT シグナルを「転送」する SIGINT ハンドラーを使用します。

これは、mpi 対応コードの割り込みハンドラーを記述して実行するmpirun -np 3 my-mpi-enabled-executableと、3 つのプロセスのそれぞれに対して SIGINT が発生することを意味します。その直後、mpirun は終了します。これは、エラー メッセージを出力して終了するだけの小さなカスタム ハンドラーがある場合にうまく機能します。ただし、カスタム割り込みハンドラーが重要なジョブを実行している場合 (たとえば、重大な計算を実行したり、データを永続化したりする場合)、ハンドラーは最後まで実行されません。これは、mpirun があまりにも早く終了することを決定したためだと思います。

ctrl-cこれは、実行後に押す(つまり、SIGINTを引き起こす)ときのstderrmy-mpi-enabled-executableです。これは、期待される望ましい動作です。

interrupted by signal 2.
running viterbi... done.
persisting parameters... done.
the master process will now exit.

ctrl-c実行後に押したときのstderrは次のとおりmpirun -np 1 my-mpi-enabled-executableです。これは問題のある動作です:

interrupted by signal 2.
running viterbi... mpirun: killing job...

--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 8970 on node pharaoh exited on signal 0 (Unknown signal 0).
--------------------------------------------------------------------------
mpirun: clean termination accomplished

次の質問のいずれかに答えると、問題が解決します。

  • mpirun SIGINT ハンドラをオーバーライドする方法 (可能な場合)?
  • mpirun が終了した直後に生成された mpirun プロセスの終了を回避するにはどうすればよいですか?
  • mpirun が終了する前に、mpirun が子プロセスに送信している別のシグナルはありますか?
  • いわゆる「シグナル 0 (未知のシグナル 0)」を「キャプチャ」する方法はありますか (上記の 2 番目の stderr を参照)。

Linuxでopenmpi-1.6.3を実行しています。

4

2 に答える 2

3

OpenMPI マンページに従って、SIGUSR1orSIGUSR2を送信してmpirun転送し、それ自体をシャットダウンしないようにすることができます。

于 2013-04-08T14:36:53.373 に答える