mpirun的自定义中断处理程序

时间:2013-04-08 03:20:16

标签: mpi interrupt openmpi interrupt-handling keyboardinterrupt

显然,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

回答以下任何问题将解决我的问题:

  • 如何覆盖mpirun SIGINT处理程序(如果可能的话)?
  • 如何避免mpirun在mpirun终止后立即生成的进程终止?
  • 在mpirun终止之前,还有另一个信号,mpirun可能会向子进程发送信号吗?
  • 有没有办法“捕获”所谓的“信号0(未知信号0)”(参见上面的第二个stderr)?

我在linux上运行openmpi-1.6.3。

2 个答案:

答案 0 :(得分:3)

根据OpenMPI manpage,您可以向SIGUSR1SIGUSR2发送mpirun来转发它,而不是自行关闭。

答案 1 :(得分:0)

当遇到同样的问题时,我遇到了这个问题和@Zulan的答案。

特别是我想从用户那里捕捉SIGINT(Ctrl + C),做一些事情,然后以有序的方式退出。因此,使用SIGUSR1不是一种选择。但是,阅读@Zulan链接的手册页,显示mpirun(至少是OpenMPI版本)捕获SIGINT,然后向子进程发送SIGTERM信号。因此,在我的代码中捕获SIGTERM允许我调用正确的退出例程。

请注意,信号处理不会与MPI一起保存here