MPI標準(295ページ)には次のように書かれています。
ユーザーへのアドバイス。エラーコードが実行可能ファイルから返されるか、MPIプロセス起動メカニズム(mpiexecなど)から返されるかは、MPIライブラリの品質の側面ですが、必須ではありません。
実際、次のコードを実行することに成功しませんでした。
if(0 == my_rank)
{
FILE* parameters = fopen("parameters.txt", "r");
if(NULL == parameters)
{
fprintf(stderr, "Could not open parameters.txt file.\n");
printf("Could not open parameters.txt file.\n");
exit(EXIT_FAILURE); //Tried MPI_Abort() as well
}
fscanf(parameters, "%i %f %f %f", N, X_DIMENSION_Dp, Y_DIMENSION_Dp, HEIGHT_DIMENSION_Dp);
fclose(parameters);
}
さらなるアクションを決定するために、エラーコードをシェルに戻すことができません。2つのエラーメッセージはどちらも出力されません。エラーコードやメッセージを専用のファイルに書いてみようかなと思います。
誰かが同様の問題を抱えたことはありますか?信頼できるエラー報告を行うためにあなたが考えたオプションは何でしたか?
編集:
問題はMPIが原因ではありませんでした。本当に間違っていたのは、スケジューラーが返したエラーコードの処理方法です。LoadLevelerがインストールされたシステムを使用しています。まずは
$ llsubmit my_job_file.sh
次に、ジョブが完了すると、ジョブのステータスとエラーコードが返された電子メールを受け取ります。私の場合、MPIプログラムがMPI_Abort関数を使用して終了した場合でも、エラーコードは常にゼロでした。次に、返されたエラーコードは、スクリプトmy_job_file.sh自体のエラーコードであり、スクリプト内で実行されるMPIプログラムではないことに気付きました。my_job_file.shは次のようになりました。
# @ different LoadLeveler options ...
poe ./my_mpi_program > my_mpi_program.output
それから私はそれを次のように変更しました
# @ different LoadLeveler options ...
poe ./my_mpi_program > my_mpi_program.output
exit $?
そして、最終的に必要なエラーコードを取得しました。