数日前からこの問題を回避しようとしています。私はハイブリッド OpenMPI + Pthreads プログラムを持っています。これは、各マシンが一連の pthread を実行するように、プログラムが複数のマシンで実行されることを意味します。
問題を単純化するために、3 台のマシンがあり、それぞれが P1 と P2 の 2 つの pthread を実行していると仮定します。これで、各マシンの P1 は、MPI_Send/Recv を使用して他のマシンの P1 と継続的に通信します。同時に、P2 はいくつかの作業を行い、定期的に MPI_Barrier を呼び出します (他のマシン上の P2 と同期するため)。これにより、MPI_Send/Recv メソッドが失敗し、プログラムがクラッシュして次のようなランダムなエラーが発生します: ピアによる接続のリセット / 不正なファイル記述子 / tcp エラー / など。
- P2 から MPI_Barrier をコメントアウトすると、すべて正常に動作します。
- P1 から MPI_Send/Recv をコメントアウトすると、すべて正常に動作します。
- P2 の MPI_Barrier と P1 の MPI_Send/Recv の両方がコメント化されていない場合、プログラムはクラッシュします。
したがって、私が考えることができる唯一の理由は、MPI_Barrier と MPI_Send/Recv が基礎となる通信レベルで互いに影響し合っているということです。
ただし、セマンティックの正確さを維持するために、P1 での通信 (MPI_Send/Recv など) と P2 での同期 (MPI_Barrier など) が必要です。そして、それらを同時に必要とします (つまり、同期点に到達する前に通信を一時停止して、通信が終了した場所から通信を続行したくないということです)。
これを行う方法はありますか?