使数据连续以在节点之间传输的有效方法
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 风格数组的包装器;没有虚拟成员,编译时定义的大小没有内部指针(只是原始数组),它也将是连续的。我强烈怀疑如果您检查了生成的程序集,您会发现 Matrixd
的 array
已经是连续的。
简而言之,我认为您不需要更改任何内容;你已经是连续的,所以 MPI 应该没问题。
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 风格数组的包装器;没有虚拟成员,编译时定义的大小没有内部指针(只是原始数组),它也将是连续的。我强烈怀疑如果您检查了生成的程序集,您会发现 Matrixd
的 array
已经是连续的。
简而言之,我认为您不需要更改任何内容;你已经是连续的,所以 MPI 应该没问题。