如果行程计数不恒定,为什么 #pragma-unrolled 循环的性能会下降?

发布于 2024-10-29 14:30:58 字数 202 浏览 0 评论 0原文

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

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

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

I have following code using loop unrolling:

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

here if n is a defined constant, everything works fine. However, if n is a variable, performance dramatically reduced. I noticed roughly 3 times the instructions are issued and executed. I guess I am looking for a way to do loop unrolling at run time, may be that's just not feasible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

攀登最高峰 2024-11-05 14:30:58

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

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

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

CUDA is a compiled language. Loop unrolling is a compiler optimization. Runtime loop unrolling would imply some sort of runtime interpreter or dynamic code generation. That clearly can't happen.

It would make sense that the unrolled case executes as many or more instructions than the naïve loop, because the compiler will replace the loop with repetitions of the loop contents. If the unrolled case executes less instructions, that would imply that the compiler is pre-calculating some or all of the loop contents and replacing code with a constant result.

It all depends on what is contained in the loop.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文