MPI で n 個のプロセス間で共有リソース (メモリ ウィンドウなど) への排他的アクセスを保証する最善の方法を教えてください。MPI_Win_lock と MPI_Win_fence を試しましたが、期待どおりに動作しないようです。つまり、複数のプロセスがクリティカル領域 (MPI_Win_lock と MPI_Win_unlock の間の MPI_Get および/または MPI_Put を含むコード) に同時に入ることがわかります。
ご提案いただければ幸いです。ありがとう。
MPI で n 個のプロセス間で共有リソース (メモリ ウィンドウなど) への排他的アクセスを保証する最善の方法を教えてください。MPI_Win_lock と MPI_Win_fence を試しましたが、期待どおりに動作しないようです。つまり、複数のプロセスがクリティカル領域 (MPI_Win_lock と MPI_Win_unlock の間の MPI_Get および/または MPI_Put を含むコード) に同時に入ることがわかります。
ご提案いただければ幸いです。ありがとう。
MPI 2 では、アトミック操作を真に行うことはできません。これは、MPI 3 で を使用して導入されましたMPI_Fetch_and_op
。これが、重要なデータが変更される理由です。
さらに、`MPI_Win_lock' にも注意してください。ここで説明されているように:
このルーチンの名前は誤解を招きます。特に、このルーチンは、ターゲット プロセスが呼び出しプロセスである場合を除き、ブロックする必要はありません。
実際のブロッキング プロセスは ですMPI_Win_unlock
。つまり、この手順から戻った後にのみ、 と の値が正しいことを確認できput
ますget
。おそらく、これはここでよりよく説明されています:
MPI パッシブ ターゲット操作は、MPI Win ロックおよび MPI Win ロック解除呼び出しで囲まれたアクセス エポックに編成されます。巧妙な MPI 実装 [10] は、すべてのデータ移動操作 (プット、取得、蓄積) を、ロック解除時に発生する 1 つのネットワーク トランザクションに結合します。
この同じドキュメントは、重要なデータがアトミックに書き込まれていないという問題の解決策を提供することもできます。これは、一度に 1 つのプロセスだけがデータにアクセスできるようにするメカニズムであるミューテックスを使用して行われます。
このドキュメントを読むことをお勧めします: 彼らが提案するソリューションは、実装するのは難しくありません。