我有以下 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
展开特定循环?
注意。相似的#pragma nounroll
如果我使用 Intel icc 就可以。
根据文档,#pragma GCC unroll 1
如果你这样放置的话,应该可以工作。如果没有,那么您应该提交错误报告。
或者,您可以使用函数属性来设置优化,我认为:
void myfn () __attribute__((optimize("no-unroll-loops")));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)