我知道“为什么我的编译器要这样做”不是最好的问题类型,但这个问题对我来说真的很奇怪,我很困惑。
我原以为这std::min()与手写的三元相同(可能还有一些编译时模板的东西),并且在正常使用时似乎可以编译为相同的操作。但是,当尝试使“最小和总和”循环自动向量化时,它们似乎不一样,如果有人能帮我找出原因,我会很高兴。这是一个产生问题的小示例代码:
#pragma GCC target ("avx2")
#pragma GCC optimize ("O3")
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define N (1<<20)
char a[N], b[N];
int main() {
for (int i=0; i<N; ++i) {
a[i] = rand()%100;
b[i] = rand()%100;
}
int ans = 0;
#pragma GCC ivdep
for (int i=0; i<N; ++i) {
//ans += std::min(a[i], b[i]);
ans += a[i]>b[i] ? a[i] : b[i];
}
printf("%d\n", ans);
}
Run Code Online (Sandbox Code Playgroud)
我gcc 9.3.0用编译命令编译它g++ -o test test.cpp -ftree-vectorize -fopt-info-vec-missed -fopt-info-vec-optimized -funsafe-math-optimizations …
c++ optimization gcc compiler-optimization auto-vectorization