std :: transform比for循环慢

时间:2019-11-18 13:29:07

标签: 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++

中的其他列

我使用Google基准测试对这两种实现之间的差异进行计时,得出的结论是,该循环比使用std :: transform快约5倍。好吧,也许应该有所不同,但没有那么大的差异。

您可以在my github repo

查看完整的代码。

matrix class matrix iterator

1 个答案:

答案 0 :(得分:1)

传递std::execution::par要求库并行化此操作。即使只是确定“您的问题太小而无法并行化”,这也会增加开销。在值得进行并行化之前,要转换的元素数量必须非常大(有时成千上万或数百万),并且要求您具有适当的硬件(在两核计算机上并行化的价值远小于在并行处理上的价值) 64核计算机)。

for循环版本与无std::transform参数的普通std::execution::par更为相似。如果删除该参数,但性能差异仍然很大,请使用该信息以及编译器版本,平台,编译器开关以及有关数据集的信息(行/列数等)来更新您的问题。