MPI がユーザー コードでメモリ アクセスをシリアル化することはありません (一般に、これはライブラリの権限を超えています)。正確に何が起こるかは実装によって異なります。
しかし、実際問題として、MPI ライブラリは「バックグラウンド」で期待するほど多くの通信を行いません。これは特に、tcp + イーサネットなどのトランスポートやネットワークを使用する場合に当てはまり、通信を渡す意味のある方法がない場合に当てはまります。別のハードウェア セット。
MPI ライブラリ コードを実行している場合 (MPI 関数呼び出しなど) にのみ、MPI ライブラリが実際に何かを実行していることを確認できます。多くの場合、多数の MPI 呼び出しのいずれかを呼び出すと、進行中のメッセージを追跡してそれらを先導する実装の「進行エンジン」が微調整されます。したがって、たとえば、計算ループ内のリクエストで MPI_Test() を呼び出して、MPI_Wait() よりも前に処理が開始されるようにすることが簡単にできます。もちろん、これにはオーバーヘッドがありますが、これは簡単に測定できるものです。
もちろん、MPI ライブラリが別のメカニズムを使用してバックグラウンドで実行することも想像できます。MPICH2 と OpenMPI はどちらも、ユーザー コードとは別に実行され、バックグラウンドでこの案内を行う個別の「プログレス スレッド」で遊んでいます。しかし、計算を実行しようとしているときにプロセッサを拘束せずに、それをうまく機能させることは、本当に難しい問題です。OpenMPI のプログレス スレッドの実装は長い間実験的なものでした。実際、現在の (1.6.x) リリースでは一時的に廃止されていますが、作業は継続されています。MPICH2 のサポートについてはよくわかりません。
ネットワークハードウェアに多くのインテリジェンスがあるインフィニバンドを使用している場合、見通しは少し明るくなります. (openfabrics の場合) メモリをピン留めしたままにしておく場合、および/またはベンダー固有のモジュール (Mellanox の場合は mxm、Qlogic の場合は psm) を使用できる場合は、状況がいくぶん速く進む可能性があります。共有メモリを使用している場合、knem カーネル モジュールはノード内トランスポートにも役立ちます。
メモリが大きな問題ではない場合に実行できるもう 1 つの実装固有のアプローチは、データを直接送信するために熱心なプロトコルを使用するか、チャンクごとにより多くのデータを送信して、進行エンジンのナッジが少なくて済むようにすることです。ここで熱心なプロトコルが意味することは、最終的にメッセージの送信につながる一連のハンドシェイクを開始するのではなく、送信時にデータが自動的に送信されることです。悪いニュースは、これには通常、ライブラリ用に追加のバッファ メモリが必要になることですが、それが問題ではなく、着信メッセージの数が制限されていることがわかっている場合 (たとえば、ハロー ネイバーの数によって)、これは非常に役立ちます。 . (例) openmpi の共有メモリ トランスポートに対してこれを行う方法は、共有メモリのチューニングに関する OpenMPI ページで説明されています。ですが、他のトランスポートや他の実装にも同様のパラメータが存在します。IntelMPIが備えている優れたツールの 1 つは、最高のパフォーマンスを得るために多数のパラメーターを自動的に実行する「mpitune」ツールです。