У меня есть ядро 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?
#pragma unroll
является единственным механизмом запроса на развертывание, который задокументирован в Руководстве по программированию CUDA C 5.5, и его необходимо указывать перед каждым циклом. Но по умолчанию компилятор развертывает все «маленькие циклы с известным счетчиком отключений», поэтому вам не понадобятся директивы развертывания в первом примере.
Я не думаю, что управление развертыванием на уровне функций было бы таким полезным. Вероятно, сначала следует полагаться на компилятор, чтобы выбрать наилучшее количество развертываний, а затем настраивать каждый цикл отдельно, если профилирование показывает, что это может помочь.
Других решений пока нет …