为的mpirun定制的中断处理程序(a custom interrupt handler for m

2019-08-20 05:11发布

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

Answer 1:

按照该的openmpi联机帮助 ,您可以发送一个SIGUSR1SIGUSR2mpirun将转交,并不会关闭itsself。



Answer 2:

有同样的问题的时候,我遇到了这个问题,并通过@Zulan答案。

我特别想赶上SIGINT从用户(按Ctrl + C),做一些东西,然后退出以有序的方式。 因此,使用SIGUSR1不是一种选择。 然而,读这@Zulan链接的手册页,显示的mpirun(至少版本的openmpi)接球SIGINT然后发送SIGTERM信号给子进程。 因此,抓住SIGTERM在我的代码让我打电话给适当的退出程序。

需要注意的是信号处理不与MPI另存为注意这里 。



文章来源: a custom interrupt handler for mpirun