Скажите gcc, чтобы конкретно развернуть цикл

Как я могу сказать GCC развернуть определенный цикл? Я использовал CUDA SDK, где циклы можно развернуть вручную, используя #pragma unroll, Есть ли подобная функция для gcc? Я немного погуглил, но ничего не смог найти.

3 ответа

Решение

GCC дает вам несколько способов справиться с этим:

  • Используйте директивы #pragma, например #pragma GCC optimize ("string"...), как видно из документов GCC. Обратите внимание, что прагма делает оптимизации глобальными для остальных функций. Если вы использовали #pragma push_options а также pop_options Макросы умно, вы могли бы определить это только с помощью одной функции, например:

    #pragma GCC push_options
    #pragma GCC optimize ("unroll-loops")
    
    //add 5 to each element of the int array.
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }
    
    #pragma GCC pop_options
    
  • Аннотируйте отдельные функции с помощью синтаксиса атрибутов GCC: обратитесь к документации по атрибутам функций GCC для более подробной диссертации по этому вопросу. Пример:

    //add 5 to each element of the int array.
    __attribute__((optimize("unroll-loops")))
    void add5(int a[20]) {
        int i = 19;
        for(; i > 0; i--) {
            a[i] += 5;
        }
    }
    

Примечание: я не уверен, насколько хорош GCC при развертывании циклов с обратной итерацией (я сделал это, чтобы Markdown хорошо играл с моим кодом). Однако примеры должны хорошо скомпилироваться.

GCC 8 получил новую прагму, которая позволяет вам контролировать, как выполняется развертывание цикла:

#pragma GCC unroll n

Цитирование из руководства:

Вы можете использовать эту прагму, чтобы контролировать, сколько раз цикл должен быть развернут. Он должен быть помещен непосредственно перед циклом for, while или do или #pragma GCC ivdep и применяется только к следующему циклу. n является целочисленным константным выражением, определяющим коэффициент развертывания. Значения 0 и 1 блокируют любое развертывание цикла.

-funroll-loops может быть полезным (хотя он включает глобальное развертывание циклов, а не цикл). Я не уверен, есть ли #pragma сделать то же самое...

Другие вопросы по тегам