禁用GCC中函数中特定循环的自动矢量化
我想关闭函数中特定循环的自动矢量化。如何使用GCC实现这一点?我知道我可以使用禁用GCC中函数中特定循环的自动矢量化,gcc,auto-vectorization,Gcc,Auto Vectorization,我想关闭函数中特定循环的自动矢量化。如何使用GCC实现这一点?我知道我可以使用\uuuu属性((优化(“无树向量”))关闭整个函数的自动向量化,但如何对函数中的单个循环执行此操作(使用MSVC,我可以使用add\pragma循环(无向量)) void dot\u int(int*\u restrict a,int*\u restrict b,int*\u restrict c){ 对于(int i=0;i,如果有人关心,我想出了一个解决方案。事实恰恰相反。它不是为某些循环禁用自动矢量化,而是只为
\uuuu属性((优化(“无树向量”))
关闭整个函数的自动向量化,但如何对函数中的单个循环执行此操作(使用MSVC,我可以使用add\pragma循环(无向量)
)
void dot\u int(int*\u restrict a,int*\u restrict b,int*\u restrict c){
对于(int i=0;i,如果有人关心,我想出了一个解决方案。事实恰恰相反。它不是为某些循环禁用自动矢量化,而是只为某些循环启用它
要执行此操作,请使用-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];
}
}
void dot\u int(int*\u restrict a,int*\u restrict b,int*\u restrict c){
#pragma-omp-simd
对于(int i=0;i)我想问你为什么要这样做?我正在尝试将向量化循环分为向量化和非向量化部分。现在的方式是,我只能得到一个。我尝试使用单独的内联函数,但没有成功。
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];
}
}