【发布时间】:2019-04-12 01:25:17
【问题描述】:
在下面的代码中,为什么第二个循环可以自动矢量化,而第一个不能?如何修改代码使其自动矢量化? gcc 说:
注意:未矢量化:循环中的控制流。
我使用的是 gcc 8.2,标志是 -O3 -fopt-info-vec-all。我正在为 x86-64 avx2 编译。
#include <stdlib.h>
#include <math.h>
void foo(const float * x, const float * y, const int * v, float * vec, float * novec, size_t size) {
size_t i;
float bar;
for (i=0 ; i<size ; ++i){
bar = x[i] - y[i];
novec[i] = v[i] ? bar : NAN;
}
for (i=0 ; i<size ; ++i){
bar = x[i];
vec[i] = v[i] ? bar : NAN;
}
}
更新: 这会自动矢量化:
for (i=0 ; i<size ; ++i){
bar = x[i];
novec[i] = v[i] ? bar : NAN;
novec[i] -= y[i];
}
我还是想知道为什么 gcc 说第一个循环的控制流。
【问题讨论】:
-
为我矢量化。
-
@EOF:clang 按照您期望的方式对其进行矢量化,但 gcc8.2 没有。 (即使将
restrict添加到所有指针,并使用-march=haswell)godbolt.org/z/cnlwuO。
标签: c gcc avx2 auto-vectorization