禁用GCC中函数中特定循环的自动矢量化

时间:2014-05-16 13:28:37

标签: gcc auto-vectorization

我想关闭函数中特定循环的自动矢量化。我怎样才能用GCC做到这一点?我知道我可以使用__attribute__((optimize("no-tree-vectorize")))关闭整个函数的自动向量化,但是我如何为函数中的各个循环执行此操作(使用MSVC我可以使用add #pragma loop(no_vector))。

void dot_int(int * __restrict a, int * __restrict b, int * __restrict c) { 
    for(int i=0; i<1024; i++) {        
        c[i] = a[i] + b[i];
    }
    //#pragma loop(no_vector)  //don't vectorize this loop
    for(int i=0; i<1024; i++) {        
        c[i] = a[i] + b[i];
    }
}

1 个答案:

答案 0 :(得分:0)

如果有人关心,我想出了一个解决方案。这真的是相反的。它不是禁用某些循环的自动矢量化,而只是为某些循环启用它。

要执行此操作,请使用-O2进行编译并使用#pragma omp simd

void dot_int(int * __restrict a, int * __restrict b, int * __restrict c) {
    #pragma omp simd 
    for(int i=0; i<1024; i++) {        
        c[i] = a[i] + b[i];
    }

    for(int i=0; i<1024; i++) {        
        c[i] = a[i] + b[i];
    }
}

认为#pragma omp simd的矢量化不一定与使用-O3的矢量化生成相同的代码。