【发布时间】:2011-07-26 14:55:41
【问题描述】:
我有以下代码使用循环展开:
#pragma unroll
for (int i=0;i<n;i++)
{
....
}
如果 n 是一个已定义的常量,那么一切正常。但是,如果 n 是一个变量,则性能会显着降低。我注意到大约 3 次指令被发出和执行。我想我正在寻找一种在运行时进行循环展开的方法,这可能是不可行的。
【问题讨论】:
我有以下代码使用循环展开:
#pragma unroll
for (int i=0;i<n;i++)
{
....
}
如果 n 是一个已定义的常量,那么一切正常。但是,如果 n 是一个变量,则性能会显着降低。我注意到大约 3 次指令被发出和执行。我想我正在寻找一种在运行时进行循环展开的方法,这可能是不可行的。
【问题讨论】:
CUDA 是一种编译语言。循环展开是一种编译器优化。运行时循环展开意味着某种运行时解释器或动态代码生成。这显然不可能发生。
unrolled 案例执行的指令与原始循环一样多或更多是有道理的,因为编译器将用循环内容的重复来替换循环。如果展开的 case 执行 less 指令,这意味着编译器正在预先计算部分或全部循环内容并用常量结果替换代码。
这完全取决于循环中包含的内容。
【讨论】: