Скажите 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
сделать то же самое...