3

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 を実装する他の方法を教えてくれたら。本当にありがとうございました。

4

1 に答える 1

1

MPI での全対全は、MPI_ALLTOALLまたはによって実行されMPI_ALLTOALLVます。通常の呼び出しには、データの送受信用に 2 つの別個のバッファーが必要です。MPI 標準では、両方の操作の「インプレース」オプションも定義されています。あなたの場合、このコードはそれを行う必要があります:

double p[8];

MPI_Alltoall(MPI_IN_PLACE, 1, MPI_DOBLE,  // send count and datatype are ignored
             p, 1, MPI_DOUBLE,
             MPI_COMM_WORLD);

残念ながら、一部の MPI 実装は、この「インプレース」モードをサポートしていません。注目すべき例の 1 つが Open MPI です。MPICH2 がサポートしています。

これを実装する 1 つの方法を次に示します。 MPICH2 alltoall.c

于 2012-10-31T09:29:41.470 に答える