Ste*_*ein 5 c++ gcc simd auto-vectorization std-ranges
我有两种点积实现:一种是手工编码的https://godbolt.org/z/48EEnnY4r
int bla2(const std::vector<int>& a, const std::vector<int>& b){
int res = 0;
for(size_t i=0; i < a.size(); ++i){
res += a[i]*b[i];
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
一个使用 C++23 的std::views::zip https://godbolt.org/z/TsGW1WYnf
int bla(const std::vector<int>& a, const std::vector<int>& b){
int res = 0;
for(const auto& [x,y] : std::views::zip(a,b)){
res += x*y;
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
在 godbolt 中,手工编码版本使用了大量 SIMD 指令,而基于 zip 的实现则没有。这里发生了什么?如果我使用迭代器实现它,它也会获得 SIMD。我认为在幕后范围只使用迭代器。这些表达式不等价吗?