显然,mpirun
使用SIGINT处理程序将SIGINT信号"转发"到它生成的每个进程。
这意味着您可以为启用 mpi 的代码编写中断处理程序,执行mpirun -np 3 my-mpi-enabled-executable
然后为三个进程中的每一个引发 SIGINT。 不久之后,mpirun退出。当您有一个仅打印错误消息然后退出的小型自定义处理程序时,这工作正常。但是,当自定义中断处理程序执行非平凡的工作(例如,执行严肃的计算或持久化数据(时,处理程序不会运行到完成。我假设这是因为mpirun决定过早退出。
这是执行my-mpi-enabled-executable
后按ctrl-c
(即导致SIGINT(时的stderr。这是理想的预期行为:
interrupted by signal 2.
running viterbi... done.
persisting parameters... done.
the master process will now exit.
这是执行mpirun -np 1 my-mpi-enabled-executable
后按 ctrl-c
时的标准。这是有问题的行为:
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 可能会发送到子进程?
- 有没有办法"捕获"所谓的"信号0(未知信号0("(参见上面的第二个标准(?
我在 Linux 上运行 openmpi-1.6.3。
根据OpenMPI手册页,您可以向mpirun
发送SIGUSR1
或SIGUSR2
,将转发它而不是自行关闭。
遇到同样的问题时,我遇到了这个问题和@Zulan的答案。
特别是我想从用户那里获取一个SIGINT
(Ctrl + C(,做一些事情,然后有序地退出。因此,使用SIGUSR1
不是一种选择。但是,阅读@Zulan链接的手册页会显示 mpirun(至少是 OpenMPI 版本(捕获SIGINT
,然后向子进程发送SIGTERM
信号。因此,在我的代码中捕获SIGTERM
允许我调用正确的退出例程。
请注意,信号处理不会与 MPI 一起保存,如此处所述。