我考虑过实现一个矩阵类,该矩阵类使用算法中的 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 查看完整代码
最佳答案
传递 std::execution::par
要求库并行化此操作。这增加了开销,即使它只是确定“您的问题太小而无法并行化”。转换的元素数量必须非常大(有时数十万或数百万)才能进行并行化,并且需要您拥有合适的硬件(在双核机器上进行并行化比在64 核机器)。
for
循环版本更类似于没有 std::execution::par
参数的普通 std::transform
。如果您删除该参数并且性能差异仍然很大,请使用该信息更新您的问题,以及您的编译器版本、平台、编译器开关和有关您的数据集的信息:行数/列数等。
关于c++ - std::transform 比 for 循环慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58915698/