在 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 的函数中禁用特定循环的自动矢量化的主要内容,如果未能解决你的问题,请参考以下文章

使用 GCC 强制自动矢量化

gcc中的数组与指针自动矢量化

GCC:两个相似循环之间的向量化差异

双和ffast数学的自动矢量化

Visual Studio 的循环矢量化(手动和自动)都有哪些资源?

当数组是函数参数时,矩阵乘法中的 Gcc 自动向量化奇怪行为