gcc自动向量化控制循环流程

时间:2018-11-08 14:06:07

标签: c gcc avx2 auto-vectorization

在下面的代码中,为什么第二个循环能够被自动矢量化,而第一个不能?如何修改代码以使其自动矢量化? 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会说第一个循环的控制流。

1 个答案:

答案 0 :(得分:5)

clang即使第一个循环也会自动矢量化,但gcc8.2不会。 (https://godbolt.org/z/cnlwuO

gcc使用-fno-trapping-math向量化。也许是担心从减法中保留FP异常标志状态?

-ffast-math足以让gcc自动向量化(没有bar设置的其余部分),因此显然它担心FP异常。 (https://godbolt.org/z/804ykV)。我认为这太过谨慎了,因为无论是否使用C源,都会每次都计算a[i] = b[i]+c[i]

gcc将自动向量化简单的FP <input type="file" name="file1"> Describe your file: <input type="text" name="desc1"> 循环,而无需任何FP数学选项。