Могу ли я сказать 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?

2

Решение

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

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

6

Другие решения

Других решений пока нет …