Почему производительность моего # развернутого цикла pragma ухудшается, если количество отключений не является постоянным? - PullRequest
10 голосов
/ 31 марта 2011

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

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

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

1 Ответ

18 голосов
/ 31 марта 2011

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

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

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

...