显然,mpirun
使用SIGINT处理程序将SIGINT信号“转发”到它产生的每个进程。
这意味着您可以为启用mpi的代码编写中断处理程序,执行mpirun -np 3 my-mpi-enabled-executable
然后将为这三个进程中的每一个引发SIGINT。不久之后,mpirun退出。当你有一个小的自定义处理程序,它只打印一个错误信息,然后退出时,这很好。 但是,当您的自定义中断处理程序正在执行一项非常重要的工作(例如,执行严格的计算或持久化数据)时,处理程序不会运行完成。我假设这是因为mpirun决定退出太快。
这是执行ctrl-c
后按my-mpi-enabled-executable
(即导致SIGINT)的stderr。这是理想的预期行为:
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
的stderr。这是一个有问题的行为:
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。
答案 0 :(得分:3)
根据OpenMPI manpage,您可以向SIGUSR1
或SIGUSR2
发送mpirun
来转发它,而不是自行关闭。
答案 1 :(得分:0)
当遇到同样的问题时,我遇到了这个问题和@Zulan的答案。
特别是我想从用户那里捕捉SIGINT
(Ctrl + C),做一些事情,然后以有序的方式退出。因此,使用SIGUSR1
不是一种选择。但是,阅读@Zulan链接的手册页,显示mpirun(至少是OpenMPI版本)捕获SIGINT
,然后向子进程发送SIGTERM
信号。因此,在我的代码中捕获SIGTERM
允许我调用正确的退出例程。
请注意,信号处理不会与MPI一起保存here。