2017-07-25 2 views
0

私はOpenMPIでシグナル処理を理解するために取り組んでいます。私は、「Open MPIがSIGUSR1とSIGUSR2をmpiexecから他のプロセスに転送する」と読んでいます。私の質問は、この機能はデフォルトインストールで有効になっているということです。OpenMPIでのシグナルハンドリングのエラー

シナリオでは、1つのMPIプロセスがSIGUSR1を発生させます。これは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

としてこれを実行する場合、私は、他の2つのプロセスから2回印刷されたステートメントを持つことが期待されます。しかし、このコードを実行すると、アプリケーションプロセスとは異なり、ORTE HNPから一度だけ印刷されます。 ortedがこのシグナルを明示的に渡して、アプリケーション・プロセスがSIGUSR1を受け取るように他のAPIを呼び出す必要がありますか?

- マルク

あなたはあなたが記述方法転送信号を使用することはできません

答えて

1

オープンMPIは、他のプロセスには、mpiexecからSIGUSR1とSIGUSR2 を転送します

することができますあなた自身に信号を送るだけでは、mpiexecのプロセスが見つかるはずです。このプロセスは別のノードで実行できるため、信号を簡単に送信することはできません。

MPI_Abortを除いて、他のMPIランクを本当に中断するのは妥当な方法とは思えません。これはおそらくあなたが望むものではありません。実際の目標に応じて、おそらく非同期のポイントツーポイント通信、片側の通信またはスレッドから選択する必要があります。

+0

私もこれを試しました。各プロセスはpidを発行し、別のシェルからkill -SIGUSR を使用してシグナルを引き上げます。それでも一度印刷すると、シグナルハンドラのステートメントが各プロセスに2回印刷されることを期待しています。 – marc

+0

私は真剣にあなたが間違ったツールを使って何をしようとしていると思っています。 – Zulan

関連する問題