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

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

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

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

Ответ 1

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

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

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