Отключить развертывание определенного цикла в GCC - PullRequest
0 голосов
/ 21 сентября 2018

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

1 Ответ

0 голосов
/ 21 сентября 2018

Согласно документации, #pragma GCC unroll 1 должен работать, если вы его так и разместите.Если этого не произойдет, вы должны отправить отчет об ошибке.

В качестве альтернативы, вы можете использовать атрибут функции для установки оптимизации, я думаю:

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