2 つの配列 (それぞれ長さ n) をルート プロセス (ランク = 0) の受信バッファーに結合して、長さ 2*n の配列、つまりすべての値を含む単一の配列を形成しようとしています。
簡潔にするために、私のコードは次のようになります。
#define ROOT 0
int myFunction(int* rBuf, int n) {
int* sBuf = malloc(n*sizeof(int));
// Do work, calculate offset, count etc.
MPI_Reduce(sBuf, rBuf+offset[rank], counts[rank],
MPI_INT, MPI_SUM, ROOT, MPI_COMM_WORLD);
}
// where offset[rank] is amount to offset where it is to be received
// offset[0] = 0, offset[1] = n
// counts contains the length of arrays on each process
ただし、rBuf をチェックすると、オフセットなしで rBuf に縮小されます。次に例を示します。
// Rank 0: sBuf = {3, 2}
// Rank 1: sBuf = {5, 1}
// Should be rBuf = {3, 2, 5, 1}
rBuf = {8, 3, 0, 0}
追加情報:
- rBuf は、削減前に値が 0 で正しいサイズに初期化されます
- すべてのプロセスにはオフセット配列があります
- その時点で MPI_Reduce を使用した理由は、rBuf が 0 に設定されている場合、MPI_SUM で削減すると必要な答えが得られるためです。
ドキュメント、オンラインのチュートリアル/ガイド、そしてもちろんSOを調べましたが、何が間違っているのかまだわかりません。
答えとして、私は特に探しています:
- これは MPI_Reduce を使用して技術的に可能ですか?
- 私の MPI_Reduce 呼び出しは正しいですか? (ポインタ演算のエラー?)
- MPI を使用した実行可能/適切なプラクティスはありますか、それともより良いアプローチですか?
ありがとう