C++ を使用してハイパーキューブ ネットワークに All-To-All (MPI_Allgather) 操作を実装しようとしています。
たとえば、n (プロセッサの数) = 8 の場合、初期データを次のように保存します。
p0: [00, 01, 02, ..., 07];
p1: [10, 11, 12, ..., 17],
...
...
p7: [70, 71, 72, ..., 77].
最終的に All-To-All を実行すると、データは次のようになります。
p0: [00, 10, 20, ..., 70],
P1: [01, 11, 21, ..., 71],
...,
p7: [07, 17, 27, ..., 77].
(つまり、すべてのプロセッサが他のすべてのプロセッサからデータを取得します)。
私は、2 つのプロセッサ間でデータを交換するステップを含む、いくつかのマスクとループを使用するアルゴリズムについて考えました。 p3 から p0 まで同時に)。MPI_Send と MPI_Recv を使用すると、データを送信する前に受信側の半分の配列が上書きされるため、これを達成できません。これを行うために使用できるテクニックを教えてくれる人はいますか? 中間バッファーを使用することを考えましたが、送信および受信 MPI コードの記述方法が正確にはわかりません。
または、誰かが All-to-All を実装する他の方法を教えてくれたら。本当にありがとうございました。