1
struct Face
{
    // Matrixd is 1D representation of 2D matrix
    std::array < Matrixd<5,5>, 2 > M;
};

std::vector <Face> face;

ノード間で for ループを分散しています。すべてのノードが要素の処理を終了したら、対応する要素をノード間で転送したいと考えています。しかし、データを使用するためのAFAIKはMPI_Allgatherv連続している必要があります。まず、2D 行列の 1D 表現に切り替えました (以前は [][] 表記を使用していました)。face.M今、私は連続したいと思っています。たとえば、M [0]のすべての要素をstd::arrayノード間の転送にコピーすることを考えています。この方法は効率的ですか?私が扱うデータの数を把握するために、20k のセルがある場合、最大で 20k*3=60k の面があります。私も100万個の細胞を持っているかもしれません。

4

1 に答える 1

1

C/C++ の真の 2D 配列。たとえばint foo[5][5]、既にメモリ内で連続しています。int foo[25]基本的には、アクセスがfoo[3][2]暗黙的foo[3*5 + 2]にフラットな等価物を検索する場所の単なる構文糖衣です。Matrixd単一の次元で定義された に切り替えても、実際のメモリ レイアウトは変更されません。

std::array(ほとんど)Cスタイルの配列の単なるラッパーでもあります。仮想メンバーがなく、コンパイル時に定義された内部ポインターのないサイズ (生の配列のみ) の場合、それも連続します。生成されたアセンブリを確認すると、arrayofMatrixdが既に連続していることがわかると思います。

要するに、何も変更する必要はないと思います。あなたはすでに連続しているので、MPIは問題ないはずです。

于 2015-12-23T16:08:23.060 に答える