4

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

4

2 回答 2

3

根据OpenMPI 联机帮助页,您可以发送一个SIGUSR1orSIGUSR2mpirun其转发给它而不是自行关闭。

于 2013-04-08T14:36:53.373 回答
0

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

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

请注意,信号处理不使用 MPI 保存,如此所述。

于 2017-06-22T13:55:35.393 回答