gpt4 book ai didi

c++ - 在原始循环上使用 boost::irange 的性能损失

转载 作者:行者123 更新时间:2023-11-30 03:13:15 24 4
gpt4 key购买 nike

几个answers和讨论,甚至是source code boost::irange 的作者提到,在原始 for 循环中使用这些范围会降低性能。

但是,例如对于下面的代码

#include <boost/range/irange.hpp>

int sum(int* v, int n) {
int result{};
for (auto i : boost::irange(0, n)) {
result += v[i];
}
return result;
}

int sum2(int* v, int n) {
int result{};
for (int i = 0; i < n; ++i) {
result += v[i];
}
return result;
}

我发现生成的(-O3 优化)代码没有差异 ( Compiler Explorer )。有没有人看到使用这样的整数范围会导致现代编译器中更糟糕的代码生成的示例?

编辑:显然,调试性能可能会受到影响,但这不是我的目标。关于跨步(步长 > 1)示例,我认为可以修改 irange 代码以更接近地匹配跨步原始 for 循环的代码。

最佳答案

Does anyone see an example where using such an integer range could lead to worse code generation in modern compilers?

是的。并未说明您的特定案例受到影响。但是将步骤更改为 1 以外的任何其他内容:

#include <boost/range/irange.hpp>

int sum(int* v, int n) {
int result{};
for (auto i : boost::irange(0, n, 8)) {
result += v[i]; //^^^ different steps
}
return result;
}

int sum2(int* v, int n) {
int result{};
for (int i = 0; i < n; i+=8) {
result += v[i]; //^^^ different steps
}
return result;
}

Live .
虽然 sum 现在看起来更糟(循环没有展开),sum2 仍然受益于循环展开和 SIMD 优化。

编辑:

要对您的编辑发表评论,确实可以将橙色代码修改得更接近。但是:
如何适应range-based for loops展开后,boost::irange(0, n, 8) 必须创建某种临时的,实现 begin/end 迭代器和前缀operator++(这显然不像 int += 操作那么简单)。编译器正在使用模式匹配进行优化,它被修剪以与标准 C++ 和标准库一起使用。因此,任何结果都来自 irange;如果它与编译器知道要优化的模式略有不同,优化将不会启动。我认为,这就是库的作者提到性能损失的原因。

关于c++ - 在原始循环上使用 boost::irange 的性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58855100/

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