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