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

Efficient way of making data contiguous to transfer it among nodes

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

std::vector <Face> face;

我在节点之间有一个分布式 for 循环。在所有节点完成对它们的元素的处理后,我想在节点之间传输相应的元素。但是 AFAIK 使用 MPI_Allgatherv 数据应该是连续的。首先,我切换到二维矩阵的一维表示(我之前使用 [][] 表示法)。现在我想让 face.M 连续。我正在考虑将 M[0] 的所有元素复制到 std::array 节点之间的传输。这种方式有效率吗?为了了解我使用的数据数量,如果我有 20k 个单元格,最多我有 20k*3=60k 个面孔。我可能也有一百万个细胞。

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

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

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