どうやら、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を実行しています。