c++ - std::transform 比 for 循环慢

标签 c++ matrix c++17

我考虑过实现一个矩阵类,该矩阵类使用算法中的 std::transform 进行计算,但我发现在某些情况下,编写循环会更快。

查看添加 operator+= 以进行元素明智的添加。如果 rhs 矩阵有 1 col 而行数与 lhs 矩阵相同,我可以执行以下操作:

for (auto c = 0; c < cols(); ++c) {
    std::transform(std::execution::par, col_begin(c), col_end(c), rhs.begin(), col_begin(c), std::plus<>());
}

或者使用简单的循环:

auto lhsval = begin();
auto rhsval= rhs.begin();

for (auto r = 0; r < rows(); ++r) {
   for (auto c = 0; c < cols(); ++c) {
       *lhsval += *rhsval;
       ++lhsval;
   }
   ++rhsval;
}

供您引用,我编写了一个接受步骤的迭代器。所以 col_begin() 返回一个迭代器,它将跳过 operator++

中的其他列

我使用谷歌基准测试了两种实现之间的差异,得出的结论是循环比使用 std::transform 快大约 5 倍。好吧,也许应该有区别,但不会有那么大的区别。

您可以在 my github repo 查看完整代码

matrix class matrix iterator

最佳答案

传递 std::execution::par 要求库并行化此操作。这增加了开销,即使它只是确定“您的问题太小而无法并行化”。转换的元素数量必须非常大(有时数十万或数百万)才能进行并行化,并且需要您拥有合适的硬件(在双核机器上进行并行化比在64 核机器)。

for 循环版本更类似于没有 std::execution::par 参数的普通 std::transform。如果您删除该参数并且性能差异仍然很大,请使用该信息更新您的问题,以及您的编译器版本、平台、编译器开关和有关您的数据集的信息:行数/列数等。

关于c++ - std::transform 比 for 循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58915698/

相关文章:

c++ - 如何从文件输入然后在 C++ 中同时使用标准 i/o 流?

c++ - 如何在第三方库调用的回调函数中传递/使对象/变量可访问?

math - 矩阵运算可枚举n部分图的所有路径

python - 计算 numpy 矩阵的极分解?

matrix - 如何从 Octave 音阶的文件中加载矩阵?

c++ - 我怎样才能让这个想法以 pre 2.x boost spirit 编译?

c++ - 完美转发类模板参数推导

c++ - 编译时运算符[]

c++ - 嵌套的 for_each 循环导致 vector 大小意外增加

c++ - 将 8 个字符从内存加载到 __m256 变量中作为打包的单精度 float