3

我想关闭函数中特定循环的自动矢量化。我怎样才能用 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];
    }
}
4

1 回答 1

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

于 2017-04-25T15:14:04.947 回答