1

私のメインの FORTRAN MPI コードは、すべてのプロセスがスクリプトを呼び出すポイントに到達します。コードは次のようになります

write(syscommand,'(a131xi3)') './vscript.csh' my_mpi_proc_num
rc=system(syscommand)

これで、コードのこのセクションは 100 回以上ループし、スクリプトはすべてのプロセスで正常に実行されます。次に、私が知る限りランダムに、何らかのプロセスがシステムに入り、エラーコード 32512 を返します。その後、いくつかの他のことが起こります (申し訳ありませんが、これ以上コードを表示できません。私の雇用主はあまり満足しないでしょう. )、MPI_ABORT が呼び出され、すべてのプロセスが終了します。32512 は、コマンドが見つからない場合に返されるエラー コードであることが多いと言われています。前述したように、スクリプトはこのクラッシュの前に何百回も見つかっており、何も動かしていないため、これはありそうもありません。

私はストップギャップ測定を見つけたようです:

write(syscommand,'(a131xi3)') './vscript.csh' my_mpi_proc_num
rc=32512
num_attempts=0
do while (num_attempts<100 .and. rc==32512)
  num_attempts=num_attempts+1
  rc=system(syscommand)
enddo

つまり、各プロセスは 32512 を通過するために 100 回試行します。これは恐ろしいコードだと確信していますが、動作しています。

では、なぜこのエラーが発生するのか、誰にも手がかりがありますか? 考え: 2 つのプロセスがほぼ同時に同じスクリプトを実行しようとした場合、そのうちの 1 つが強制的に追い出され、その 32512 を返すことになりますか? ありがとう。

4

1 に答える 1

4

おそらく、コンパイラは、システム ライブラリによって提供されるsystemPOSIX 関数への呼び出しとして組み込みを実装します。system(3)

この呼び出しは、次のように構成された整数を返します。

 bits 0-6 set -- the process was stopped
 bit 7 -- core flag
 bits 8-15 -- exit status of the child process    

最後の行が重要です。

戻りコード 32512 は 0x7F00 です。つまり、子シェルの終了ステータスは 127 です。Bourne シェルやその他の UNIX シェルでは、コマンドが PATH から見つからず、組み込みのシェル コマンドではないことを意味します (この質問を参照してください)。「コマンドが見つかりません」エラーとも呼ばれます。

何かが PATH 変数でマングリングしている可能性がある場合、これがそれである可能性があります。./vscript.csh内のすべてのコマンドを絶対パスに置き換えてみてください。

一部の MPI 実装では、MPI プロセスからプロセスを生成することはサポートされていません。OpenMPI の一部のバージョンで問題が発生しています。OpenMPI プログラムを呼び出しfork()たりsystem()、OpenMPI プログラムから呼び出したりすると、次の警告が表示されます。

MPI プロセスが、子プロセスを作成するための「fork()」システム コールの呼び出しを含む操作を実行しました。Open MPI は現在、メモリの破損やその他のシステム エラーを引き起こす可能性のある状態で動作しています。MPI ジョブがハング、クラッシュ、またはサイレント データ破損を生成する可能性があります。fork() (または system() または子プロセスを作成するその他の呼び出し) の使用は、強く推奨されません。

アプリケーションが fork() の呼び出しに成功し、正しく存続することが絶対に確実な場合は、mpi_warn_on_fork MCA パラメーターを 0 に設定して、この警告を無効にすることができます。

一方、OpenMPI FAQ の最近のバージョンでは、

一般に、アプリケーションが system() または popen() を呼び出す場合、おそらく安全です。

この制限は OpenMPI に固有のものではなく、OpenFabrics スタックに依存するすべての実装に影響します。

于 2012-05-17T08:53:55.987 に答える