我想关闭函数中特定循环的自动矢量化。我怎样才能用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];
}
}
答案 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
的矢量化生成相同的代码。