2

MPI_Scatterv を使用して、非常に大きな配列を分散させています。

MPI_Scatterv(list, counts, displacements, MPI_LONG, pSubList, counts[rank], MPI_LONG, MASTER, MPI_COMM_WORLD);

変数のカウント変位を long として宣言しました (int 型では不十分です) が、MPI_Scatterv はカウントと変位に int 変数しか受け入れません。

どうすればこれを解決できますか?

4

3 に答える 3

2

少なくともほとんどの MPI 2.2 実装では、int を long に置き換えることはできません。グレッグのアドバイスに従ってユーザー定義のデータ型を作成したとしても、整数を使用して内部的にオフセットを表すなどの実装上の制限に遭遇する可能性があります (そしてほとんどの場合そうなるでしょう)。MPI 3.0 ドラフトでは、この問題に具体的に対処しており、C バインディングと Fortran バインディングの両方で、offset および count パラメーターを long (64 ビット) 型にする必要があります。

MPI 3.0 が標準になり、適合する実装が公開されるまで、ランクのサブセットに複数のスキャッターを使用して複数のラウンドでデータを配布するなど、いくつかのサブコミュニケーション スキームに固執します。

于 2012-05-13T08:04:50.860 に答える
1

int型で十分になるように、スキャッターも分散してみませんか?

ツリーのノードとして実行されているMPIプロセスを検討できます。そして、中間ツリーノードに対応するサブツリーの独自のスキャッター/ギャザーを持たせます。

于 2012-05-13T01:44:18.553 に答える
0

LONG のブロックを表すカスタム MPI データ型を作成できます。変位とカウントは、そのブロック サイズの倍数になります。

于 2012-05-13T02:12:33.770 に答える