私は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を呼び出す必要がありますか?
- マルク
あなたはあなたが記述方法転送信号を使用することはできません
私もこれを試しました。各プロセスはpidを発行し、別のシェルからkill -SIGUSRを使用してシグナルを引き上げます。それでも一度印刷すると、シグナルハンドラのステートメントが各プロセスに2回印刷されることを期待しています。 –
marc
私は真剣にあなたが間違ったツールを使って何をしようとしていると思っています。 – Zulan