禁用 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")))
我有以下 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")))