mpirun 的自定义中断处理程序

Posted

技术标签:

【中文标题】mpirun 的自定义中断处理程序【英文标题】:a custom interrupt handler for mpirun 【发布时间】:2013-03-30 00:59:32 【问题描述】:

显然,mpirun 使用了一个 SIGINT 处理程序,它将 SIGINT 信号“转发”到它产生的每个进程。

这意味着您可以为启用 mpi 的代码编写中断处理程序,执行mpirun -np 3 my-mpi-enabled-executable,然后将为三个进程中的每一个进程引发 SIGINT。不久之后,mpirun 退出。当您有一个仅打印错误消息然后退出的小型自定义处理程序时,这可以正常工作。 但是,当您的自定义中断处理程序正在执行一项重要的工作(例如,进行严肃的计算或持久化数据)时,处理程序不会运行完成。我假设这是因为 mpirun 决定过早退出。

这是执行my-mpi-enabled-executable 后按下ctrl-c(即导致SIGINT)时的标准错误。这是理想的预期行为:

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 终止之前,mpirun 是否可能向子进程发送另一个信号? 有没有办法“捕获”所谓的“信号0(未知信号0)”(参见上面的第二个stderr)?

我在 linux 上运行 openmpi-1.6.3。

【问题讨论】:

我面临同样的问题 mpirun 在发送信号 SIGINT 后立即退出,因此如果并行进程处理信号并且需要很长时间,则它们仍然在运行。如果 mpirun 之后的 bash 脚本执行其他复制文件的操作,这很糟糕,因为进程可能仍会清理 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于mpirun 的自定义中断处理程序的主要内容,如果未能解决你的问题,请参考以下文章

汇编:实验12:自定义零号中断处理程序

中断技术

masm x86 程序集崩溃中的 DOS 中断

Linux内核中断之中断申请接口

中断和异常概念详解

驱动:中断中断处理程序中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)