2017-07-25 51 views
0

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

这种情况是,一个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也是如此,与应用程序不同。我是否需要调用任何其他的API来显式传递此信号,以便应用程序进程接收SIGUSR1。

- 马克

回答

1

不能使用的信号转发您所描述的方法:

开放MPI将从mpiexec的转发SIGUSR1和SIGUSR2 到其他进程

你可以只是发送一个信号给自己,你将不得不找到mpiexec进程。这个过程可以在不同的节点上运行,所以无论如何你都不能轻易发送信号。

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

+0

我也试过这个。每个进程发布它的pid,并使用它从另一个shell中使用kill -SIGUSR 来提高信号。它仍然打印一次,我期望信号处理程序中的语句为每个进程打印两次 – marc

+0

我认真地认为您使用错误的工具来实现您尝试的任何操作。 – Zulan