禁用 GCC 中特定循环的展开

Disable unrolling of a particular loop in GCC

我有以下 4x4 矩阵向量乘法代码:

double const __restrict__ a[16];
double const __restrict__ x[4];
double       __restrict__ y[4];

//#pragma GCC unroll 1 - does not work either
#pragma GCC nounroll
for ( int j = 0; j < 4; ++j )
{
    double const* __restrict__ aj = a + j * 4;
    double const xj = x[j];

    #pragma GCC ivdep
    for ( int i = 0; i < 4; ++i )
    {
        y[i] += aj[i] * xj;
    }
}

我用 -O3 -mavx 标志编译。内部循环是矢量化的(单个 FMAD)。然而,gcc (7.2) 一直展开外循环 4 次,除非我使用 -O2 或更低的优化。

有没有办法覆盖 -O3 展开特定循环?

注意。如果我使用 Intel icc,类似的 #pragma nounroll 可以工作。

根据文档,#pragma GCC unroll 1 应该可以工作,如果您这样放置的话。如果没有,那么您应该提交错误报告。

或者,您可以使用函数属性来设置优化,我认为:

void myfn () __attribute__((optimize("no-unroll-loops")));

为了简洁的功能 没有完整和部分循环展开 在需要的时候 下面的函数属性 请尝试。

__attribute__((optimize("Os")))