最近傍スタイルのハロー スワップの場合、通常、最も効率的な実装の 1 つは、一連のMPI_Sendrecv
呼び出しを使用することです。通常は、各次元ごとに 2 つです。
ハーフステップ 1 - 正の方向へのデータ転送:各ランクは左側のランクから左側のハローにデータを受信し、右側のランクにデータを送信します。
+-+-+---------+-+-+ +-+-+---------+-+-+ +-+-+---------+-+-+
--> |R| | (i,j-1) |S| | --> |R| | (i,j) |S| | --> |R| | (i,j+1) |S| | -->
+-+-+---------+-+-+ +-+-+---------+-+-+ +-+-+---------+-+-+
(S
は通信されるローカル データの一部を示し、 はデータがR
受信されるハローを示します。 は(i,j)
プロセス グリッド内のランクの座標です)
ハーフステップ 2 - 負の方向へのデータ転送:各ランクは右側のランクから右側のハローにデータを受信し、左側のランクにデータを送信します。
+-+-+---------+-+-+ +-+-+---------+-+-+ +-+-+---------+-+-+
<-- |X|S| (i,j-1) | |R| <-- |X|S| (i,j) | |R| <-- |X|S| (i,j+1) | |R| <--
+-+-+---------+-+-+ +-+-+---------+-+-+ +-+-+---------+-+-+
(X
は、前のハーフステップで既に設定されているハロー領域の一部です)
ほとんどの交換ネットワークは、複数の同時双方向 (全二重) 通信をサポートしており、交換全体の待ち時間は次のとおりです。
上記のハーフステップは両方とも、ドメイン分解の次元と同じ回数繰り返されます。
このプロセスは、いわゆる近隣集団通信を導入する規格のバージョン 3.0 ではさらに簡素化されています。への 1 回の呼び出しを使用して、多次元ハロー スワップ全体を実行できますMPI_Neighbor_alltoallw
。