禁止在GCC中展开特定循环

时间:2018-09-21 14:26:14

标签: gcc optimization pragma loop-unrolling

我有以下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)。但是,除非我使用-O2或更低的优化,否则gcc(7.2)会连续四次展开外循环。

是否有办法覆盖特定循环的-O3展开?

NB。如果使用Intel icc,类似的#pragma nounroll也可以使用。

2 个答案:

答案 0 :(得分:2)

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

或者,您可以使用function属性来设置优化,

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

答案 1 :(得分:0)

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

__attribute__((optimize("Os")))