我有以下代码使用循环展开:
#pragma unroll
for (int i=0;i<n;i++)
{
....
}
如果n是定义的常量,那么一切正常。但是,如果n是变量,则性能会大幅降低。我注意到发出并执行了大约3次指令。我想我正在寻找一种在运行时进行循环展开的方法,可能这是不可行的。
答案 0 :(得分:18)
CUDA是一种编译语言。循环展开是编译器优化。运行时循环展开意味着某种运行时解释器或动态代码生成。这显然不可能发生。
有意义的是,展开的情况下执行的指令多于初始循环,因为编译器会用循环内容的重复来替换循环。如果展开的情况执行 less 指令,则意味着编译器正在预先计算部分或全部循环内容并用常量结果替换代码。
这完全取决于循环中包含的内容。