【问题标题】:Error in signal handling in OpenMPIOpenMPI 中的信号处理错误
【发布时间】:2017-12-31 18:27:32
【问题描述】:

我正在努力了解 OpenMPI 中的信号处理。我读到“Open MPI 会将 SIGUSR1 和 SIGUSR2 从 mpiexec 转发到其他进程”。我的问题是默认安装是否启用了此功能。

场景是一个 MPI 进程引发一个 SIGUSR1,它必须被 'orted' 检测到,然后转发给其他进程。

在我的测试代码中,我为 SIGUSR1 定义了一个自定义信号处理程序,并相应地注册了这个信号处理程序。我使用 kill() 或 raise() 发送信号。我假设 ORTE 守护进程会收到这个信号,并且必须将此信号转发给其余进程。

// test.c

void handle_signal(int signal){
if(SIGNAL==SIGUSR1)
printf("received SIGUSR1 signal \n");
}
int main(){
MPI_Init(NULL, NULL);

   int my_rank;
   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

signal(SIGUSR1, handle_signal);

if(my_rank == 1) // process with rank 1 raises SIGUSR1
     kill(getpid(), SIGUSR1);

MPI_Finalize();
return 0;
}

如果我运行这个 mpirun -np 3 ./test

我希望从其他两个进程中打印两次该语句。但是当我运行这段代码时,它只打印一次,而且来自 ORTE HNP,这与应用程序进程不同。我是否需要在 orted 上调用任何其他 API 显式传递此信号,以便应用程序进程接收 SIGUSR1。

- 马克

【问题讨论】:

    标签: c signals mpi openmpi


    【解决方案1】:

    您不能按照您描述的方式使用信号转发:

    Open MPI 会将 SIGUSR1 和 SIGUSR2 从 mpiexec 转发到其他进程

    您不能只向自己发送信号,您必须找到mpiexec 进程。这个过程可以在不同的节点上运行,所以无论如何你都不能轻易地向它发送信号。

    除了MPI_Abort,我想不出一个合理的方式来真正打断其他 MPI 等级,这可能不是你想要的。根据您的实际目标,您可能必须选择异步点对点通信、单边通信或线程。

    【讨论】:

    • 我也试过这个。每个进程都发布它的 pid,我使用它从另一个 shell 中使用 kill -SIGUSR 发出信号。它仍然打印一次,我希望信号处理程序中的语句为每个进程打印两次
    • 我严重认为您使用错误的工具来实现您正在尝试的任何东西。
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多