显然,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
回答任何问题 以下问题将解决我的问题:
我在 linux 上运行 openmpi-1.6.3。
最佳答案
根据 OpenMPI manpage您可以发送 SIGUSR1
或 SIGUSR2
至 mpirun
它将转发它而不是关闭它自己。
关于mpi - mpirun 的自定义中断处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870738/