2017-07-25 77 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