gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:34:04 24 4
gpt4 key购买 nike

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 应该没问题。

关于c++ - 使数据连续以在节点之间传输的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34438799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com