如果行程计数不是常数,为什么我的#pragma-unrolled循环的性能会降低?

sma*_*ato 11 loops cuda unroll

我有以下代码使用循环展开:

#pragma unroll
for (int i=0;i<n;i++)
{
    ....
}
Run Code Online (Sandbox Code Playgroud)

这里如果n是一个定义的常量,一切正常.但是,如果n是变量,则性能会大幅降低.我注意到发出并执行了大约3次指令.我想我正在寻找一种在运行时进行循环展开的方法,可能这是不可行的.

tal*_*ies 19

CUDA是一种编译语言.循环展开是编译器优化.运行时循环展开意味着某种运行时解释器或动态代码生成.这显然不可能发生.

因为编译器将用循环内容的重复替换循环,所以展开的情况执行与初始循环一样多或更多的指令是有意义的.如果展开的情况执行较少的指令,则意味着编译器预先计算部分或全部循环内容并用常量结果替换代码.

这一切都取决于循环中包含的内容.

  • 即使在编译时未知循环的行程计数,也可以使用open64进行循环展开,并且通常是优化,因为它可以提高指令级并行性.这里的"神秘"是非常数跳闸计数情况下的指令量,这必须是由于代码替换而不是循环展开的恒定跳闸情况. (3认同)