gpt4 book ai didi

c++ - Lambda 与手动内联代码更改 GCC 的优化器行为

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

以下代码:

#include <vector>

extern std::vector<int> rng;

int main()
{
auto is_even=[](int x){return x%2==0;};
int res=0;
for(int x:rng){
if(is_even(x))res+=x;
}

return res;
}
由 GCC 11.1 ( link to Godbolt ) 以一种非常不同的方式优化:
#include <vector>

extern std::vector<int> rng;

int main()
{
int res=0;
for(int x:rng){
if(x%2==0)res+=x;
}

return res;
}
( Link to Godbolt .) 此外,第二个版本(其中 lambda 已被直接手动注入(inject)其主体在调用位置所取代),比第一个版本快得多。
这是 GCC 错误吗?

最佳答案

在 x64 架构中没有向量化积分模运算这样的东西。这意味着代码本身并不是可矢量化的,需要事先进行转换才能完成。
在使用 SIMD 友好均匀性测试的更简单的情况下,您可以看到矢量化在两种情况下都运行良好:https://godbolt.org/z/hc5ffbePY
因此,如果有的话,可以说 GCC 设法对内联版本进行矢量化,并且将它们都内联,实际上非常令人印象深刻。
话虽如此,因为我们知道 GCC 能够执行这种转换的事实,它似乎只在内联发生之前执行,这是不幸的,并且可能值得引起维护者的注意。

关于c++ - Lambda 与手动内联代码更改 GCC 的优化器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67942354/

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