显然, mpirun
使用SIGINT处理程序,其“向前” SIGINT信号到每个它衍生的处理。
这意味着你可以写你启用了MPI代码的中断处理程序,执行mpirun -np 3 my-mpi-enabled-executable
然后SIGINT将提高为三个过程。 不久之后,退出的mpirun。 当你有一个小的自定义处理程序只打印一个错误信息,然后退出这工作得很好。 然而 ,当你自定义的中断处理程序是做了不平凡的工作(如做认真计算或保存数据),该处理程序不运行完成。 我假设这是因为决定的mpirun过早退出。
下面是在按标准错误ctrl-c
即,使SIGINT)执行后my-mpi-enabled-executable
。 这是理想的预期行为:
interrupted by signal 2.
running viterbi... done.
persisting parameters... done.
the master process will now exit.
下面是在按标准错误ctrl-c
执行后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)”(见上文第二STDERR)?
我在Linux上运行的openmpi-1.6.3。