2010-11-01 2 views
35

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

+6

Не могу поверить, что я скажу это. Если вы ничего не найдете, всегда есть ... Устройство Даффа. Теперь, где * *, я положил петь кающегося? Я знаю его где-то здесь ... – dmckee

+0

Хе вы можете сделать это с помощью макросов? Наверное, нет, так что просто написать это - это единственное, что осталось? – Nils

+6

По всей видимости, я бы предложил изучить отдельную компиляцию всего этого бита с помощью '-funroll-loops' перед использованием Duff's Device: это прекрасная вещь для изучения, но уродливая вещь, которая есть в вашем коде. – dmckee

ответ

43

НКУ дает вам несколько различных способов обработки:

  • Использование #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 function attribute документов для более детальной диссертации на предмет. Пример:

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

+1

Очень классно, что для этого есть атрибут функции, однако он игнорируется последним GCC от Apple для iOS: «предупреждение:« оптимизировать »директива атрибута игнорируется». (Я знаю, что они перешли на LLVM, но я по-прежнему использую GCC иногда, поскольку он иногда создает более быстрый код.) Кто-нибудь знает, почему его игнорируют? Является ли ветка GCC от Apple слишком старой? На стороне примечания, в функции, на которой я его использовал, петли все равно разворачиваются, пока я использую -O3. – Simplex

+0

Я просто попробовал '__attribute __ ((оптимизировать (« unroll-loops »)))' с некоторым встроенным кодом, и он улучшил скорость всего на 3%. Ручное разворот в 8 раз улучшило скорость на 12% и не увеличило размер программы. – endolith

+0

Мой gcc предупреждает: игнорирование #pragma optimize ... Это всегда доступно? – neodelphi

3

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

+0

nah Я тоже нашел это, но хочу просто развернуть конкретный цикл – Nils

+0

bmei из broadcom имеет набор исправлений для добавления поддержки #pragma unroll в gcc. – osgx

+1

@ Jerry Coffin, как я могу его использовать? Можете ли вы дать мне команду, которая использует -funroll-loop? – 2011-12-14 14:20:12

Смежные вопросы