mpi - mpirun 的自定义中断处理程序

标签 mpi interrupt openmpi interrupt-handling keyboardinterrupt

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

    最佳答案

    根据 OpenMPI manpage您可以发送 SIGUSR1SIGUSR2mpirun它将转发它而不是关闭它自己。

    关于mpi - mpirun 的自定义中断处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870738/

    相关文章:

    assembly - 计算 BIOS 中断 13h 的磁头、柱面(磁道)和扇区

    c - 尽管发生中断但未调用 WiringPi ISR?

    c++ - 邮件大小限制似乎比开放MPI中的要小得多

    c++ - 为什么 mpirun 默认复制程序?

    c - 使用带有 MPI 的 master-worker 时,哪个大小的 block 将产生最佳性能?

    linux - 使用 mpirun 时,如何使分析器(valgrind、perf、pprof)获取/使用带有调试符号的本地版本的库?

    c - mpi_gather,c 中的二维动态数组,在信号 6 上退出(中止)

    c - MPI_Barrier 不在循环内工作

    java - Java 中的中断状态标志是什么以及它如何工作?

    c++ - Boost::serialization 和 boost::mpi 通过基类指针广播派生类