在 GCC 的函数中禁用特定循环的自动矢量化
Posted
技术标签:
【中文标题】在 GCC 的函数中禁用特定循环的自动矢量化【英文标题】:Disable auto-vectorization of specific loops in a function in GCC 【发布时间】:2014-05-16 13:28:37 【问题描述】:我想关闭函数中特定循环的自动矢量化。我怎样才能用 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】:万一有人在乎,我想出了一个解决方案。这真的是相反的。它不会为某些循环禁用自动矢量化,而是仅对某些循环启用它。
为此,请使用-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
的矢量化相同的代码。
【讨论】:
以上是关于在 GCC 的函数中禁用特定循环的自动矢量化的主要内容,如果未能解决你的问题,请参考以下文章