Могу ли я указать nvcc применить #pragma unroll ко всем циклам в функции?

У меня есть ядро ​​CUDA с кучей циклов, которые я хочу развернуть. Прямо сейчас я делаю:

void mykernel(int* in, int* out, int baz) {    
    #pragma unroll
    for(int i = 0; i < 4; i++) {
        foo();
    }
    /* ... */
    #pragma unroll
    for(int i = 0; i < 6; i++) {
        bar();
    }
}

и так далее. Я хочу сказать (намекнуть) моему компилятору C/C++ развернуть все эти циклы, не требуя отдельной подсказки для каждого цикла. Однако я не хочу разворачивать все циклы во всем коде в файле, только в этой функции.

Если бы это был GCC, я мог бы сделать:

__attribute__((optimize("unroll-loops")))
void mykernel(int* in, int* out, int baz) {    
    for(int i = 0; i < 4; i++) {
        foo();
    }
    /* ... */
    for(int i = 0; i < 6; i++) {
        bar();
    }
}

Или используйте опцию push-and-popping. Есть ли что-то эквивалентное, что я могу сделать с CUDA?


person einpoklum    schedule 18.12.2013    source источник


Ответы (1)


#pragma unroll — это единственный механизм запроса развертывания, описанный в Руководстве по программированию CUDA C 5.5, и его необходимо указывать перед каждым циклом. Но компилятор по умолчанию разворачивает все «небольшие циклы с известным количеством поездок», поэтому вам могут не понадобиться директивы unroll в вашем первом примере.

Я не думаю, что управление развертыванием на функциональном уровне было бы таким уж полезным. Вероятно, сначала вам следует полагаться на компилятор, чтобы выбрать наилучший объем развертывания, а затем настроить каждый цикл отдельно, если профилирование показывает, что это может помочь.

person Roger Dahl    schedule 18.12.2013
comment
Что представляет собой «маленькая петля»? - person einpoklum; 19.12.2013
comment
Я не думаю, что NVIDIA публикует эвристики для того, что автоматически развертывается, но в дополнение к счетчику поездок могут учитываться такие факторы, как количество инструкций в цикле и целевые вычислительные возможности. @njuffa дает некоторую полезную информацию здесь. - person Roger Dahl; 19.12.2013