gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:04:51 29 4
gpt4 key购买 nike

我考虑过实现一个矩阵类,该矩阵类使用算法中的 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/

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