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

4

1 回答 1

1

C/C++ 中的真正二维数组,例如int foo[5][5]在内存中已经是连续的;它基本上只是语法糖,用于在平面等价物中隐式查找的int foo[25]访问。切换到单一维度中的定义不会改变实际的内存布局。foo[3][2]foo[3*5 + 2]Matrixd

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

简而言之,我认为您不需要更改任何内容。你已经是连续的,所以 MPI 应该没问题。

于 2015-12-23T16:08:23.060 回答