Вопрос

Как я могу сказать 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 сделать то же самое ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top