У меня есть следующий код умножения матрицы на вектор 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.