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

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

Ответ 1

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 неплохо сыграл с моим кодом). Однако примеры должны компилироваться отлично.

Ответ 2

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