我有以下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
也可以使用。
答案 0 :(得分:2)
根据文档,#pragma GCC unroll 1
应该可以正常工作,如果您将其放置的话。如果没有,那么您应该提交错误报告。
或者,您可以使用function属性来设置优化,
void myfn () __attribute__((optimize("no-unroll-loops")));
答案 1 :(得分:0)
简洁功能 没有完全和部分循环展开 在需要的时候 以下函数属性 请尝试。
__attribute__((optimize("Os")))