11

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

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

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

4

1 回答 1

19

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

展开的 case 执行的指令与 naïve 循环一样多或更多是有道理的,因为编译器将用循环内容的重复来替换循环。如果展开的情况执行较少的指令,则意味着编译器正在预先计算部分或全部循环内容并用恒定结果替换代码。

这完全取决于循环中包含的内容。

于 2011-03-31T08:54:22.013 回答