Почему производительность моего цикла #pragma-unrolled ухудшается, если количество поездок не является постоянным?

У меня есть следующий код, используя цикл отматывая:

#pragma unroll
for (int i=0;i<n;i++)
{
    ....
}

здесь, Если n-определенная константа, все работает нормально. Однако, если n является переменной, производительность резко снижается. Я заметил, что примерно 3 раза инструкции выдаются и выполняются. Думаю, я ищу способ сделать цикл, разворачивающийся во время выполнения, может быть, это просто невозможно.

1 ответов


CUDA-это скомпилированный язык. Loop unrolling-это оптимизация компилятора. Развертывание цикла выполнения подразумевает какой-то интерпретатор времени выполнения или генерацию динамического кода. Этого не может быть.

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

все зависит от того, что содержится в курсе.