5

すべてのランクで同じ長さの配列があります (10 と仮定します)。配列内の一部の値には、プロセッサのランクが含まれています。例えば ​​...

Proc 1: [1 0 0 0 0 1 0 0 0 1]

Proc 2: [0 2 2 0 0 0 0 2 2 0]

Proc 3: [0 0 0 3 3 0 3 0 0 0]

すべてのプロセッサが次の配列で終わる最も効率的な方法(MPI-2を使用)は何ですか

[1 2 2 3 3 1 3 2 2 1]

これは、すべての配列 (すべてのランクに分散) の合計と考えることができます。1K 以上のコアでこれを高速に実行したいので、パフォーマンスは重要です。

4

1 に答える 1

11

これはMPI_Allreduce()with MPI_SUMorMPI_MAX演算子で実行できます。MPI_Allreduceのドキュメントを参照してください。これは、特定のアーキテクチャに最適な方法の 1 つで実装されることになっています。

int arr_a[LEN], arr_b[LEN];
...
// Fill in arr_a
MPI_Allreduce(arr_a, arr_b, LEN, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
// Result is now in arr_b

または、メモリが不足している場合は、インプレース操作を使用できますが、パフォーマンスが低下します。

MPI_Allreduce(MPI_IN_PLACE, arr_a, LEN, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
于 2012-06-04T18:52:03.303 に答える