Скажите GCC специально развернуть петлю
Вопрос
Как я могу сказать GCC развернуть определенную петлю? Я использовал CUDA SDK, где петли могут быть развернуты вручную, используя #pragma unroll
. Отказ Есть ли похожая особенность для GCC? Я немного гугул, но ничего не мог найти.
Решение
GCC дает вам несколько разных способов обращения с этим:
Использовать #PRAGMA Директивы, подобно
#pragma GCC optimize ("string"...)
, как видно в GCC Docs.. Отказ Обратите внимание, что прагма делает оптимизацию Глобальный Для оставшихся функций. Если вы использовали#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 находится в развертывании с обратным итерацией петель (я сделал это, чтобы получить уценку, чтобы играть в хорошем с моим кодом). Примеры должны компилировать штраф, хотя.
Другие советы
GCC 8 приобрел новую прагу, которая позволяет контролировать, как выполняется развертывание цикла:
#pragma GCC unroll n
Цитата из руководства:
Вы можете использовать эту прагму, чтобы контролировать, сколько раз петля должна быть развернута. Он должен быть размещен непосредственно перед собой, в то время как или выполняет петлю или #PRAGMA GCC IVDEP, и применяется только к цикле, которое следует. n - целое число постоянное выражение, указывающее фактор развертывания. Значения 0 и 1 блокируют любую развертывание петли.
-funroll-loops
может быть полезен (хотя он включает петлю, развернувшись во всем мире, а не на петлю). Я не уверен, есть ли есть #pragma
сделать то же самое ...