Почему производительность моего # развернутого цикла pragma ухудшается, если количество отключений не является постоянным?
У меня есть следующий код с использованием развертки цикла:
#pragma unroll
for (int i=0;i<n;i++)
{
....
}
здесь, если n определенная константа, все работает нормально. Однако, если n является переменной, производительность резко снижается. Я заметил примерно 3 раза инструкции выпущены и выполнены. Я думаю, что я ищу способ развернуть цикл во время выполнения, может быть, это просто невозможно.
1 ответ
CUDA - это скомпилированный язык. Развертывание цикла - это оптимизация компилятора. Развертывание цикла выполнения подразумевает какой-то интерпретатор времени выполнения или генерацию динамического кода. Это явно не может произойти.
Было бы разумно, чтобы развернутый регистр выполнял столько же или больше инструкций, чем простой цикл, потому что компилятор заменит цикл повторениями содержимого цикла. Если развернутый случай выполняет меньше инструкций, это будет означать, что компилятор предварительно вычисляет некоторое или все содержимое цикла и заменяет код постоянным результатом.
Все зависит от того, что содержится в цикле.