使数据连续的有效方式是在节点之间传输数据

时间:2015-12-23 15:24:33

标签: c++ mpi contiguous

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的面孔。我也可能有一百万个细胞。

1 个答案:

答案 0 :(得分:1)

C / C ++中的真正2D数组,例如$alarmId已经在记忆中连续;它基本上只是int foo[5][5]的语法糖,其中int foo[25]之类的访问隐含地在平面等价物中查找foo[3][2]。切换到单个维度中定义的foo[3*5 + 2]不会改变实际的内存布局。

Matrixd(大部分)也只是C风格数组的包装器;没有虚拟成员,编译时定义的大小没有内部指针(只是原始数组),它也将是连续的。我强烈怀疑如果您检查了生成的程序集,您会发现std::array的{​​{1}}已经是连续的。

简而言之,我认为你不需要改变任何东西;你已经连续了,所以MPI应该没事。