gpt4 book ai didi

cuda - 通过增加占用率来提高内核性能?

转载 作者:行者123 更新时间:2023-12-02 17:32:25 30 4
gpt4 key购买 nike

以下是 GT 440 上我的内核的计算视觉分析器的输出:

  • 内核详细信息:网格大小:[100 1 1], block 大小:[256 1 1]
  • 寄存器比率:0.84375 ( 27648/32768 ) [每个线程 35 个寄存器]
  • 共享内存比率:0.336914 ( 16560/49152 ) [每 5520 字节阻止]
  • 每个 SM 的事件 block :3(每个 SM 的最大事件 block :8)
  • 每个 SM 的事件线程:768(每个 SM 的最大事件线程:1536)
  • 潜在入住率:0.5 ( 24/48 )
  • 占用限制因素:寄存器

请注意粗体标记的项目符号。内核执行时间为121195 us

我通过将一些局部变量移动到共享内存来减少每个线程的寄存器数量。计算视觉分析器输出变为:

  • 内核详细信息:网格大小:[100 1 1], block 大小:[256 1 1]
  • 寄存器比率:1 ( 32768/32768 ) [每个线程 30 个寄存器]
  • 共享内存比率:0.451823 ( 22208/49152 ) [每 block 5552 字节]
  • 每个 SM 的事件 block :4(每个 SM 的最大事件 block :8)
  • 每个 SM 的事件线程:1024(每个 SM 的最大事件线程:1536)
  • 潜在入住率:0.666667 ( 32/48 )
  • 占用限制因素:寄存器

因此,现在 4 block 在单个 SM 上同时执行,而之前版本中则为 3 block 。然而执行时间是115756 us,几乎是一样的!为什么?这些 block 不是完全独立地在不同的 CUDA 核心上执行吗?

最佳答案

您隐含地假设更高的占用率会自动转化为更高的性能。但事实往往并非如此。

NVIDIA 架构需要每个 MP 一定数量的事件扭曲,以隐藏 GPU 的指令管道延迟。在基于 Fermi 的卡上,该要求意味着最低占用率约为 30%。目标是高于该最小值的占用率不一定会带来更高的吞吐量,因为延迟瓶颈可能已转移到 GPU 的另一部分。您的入门级 GPU 没有太多内存带宽,并且每个 MP 3 个 block 很可能足以使您的代码内存带宽受到限制,在这种情况下,增加 block 数量不会对性能产生任何影响(由于内存 Controller 争用和缓存未命中的增加,它甚至可能会下降)。此外,您说您将变量溢出到共享内存以减少内核的寄存器占用空间。在 Fermi 上,共享内存仅具有约 1000 Gb/s 的带宽,而寄存器的带宽约为 8000 Gb/s(请参阅下面的链接,了解证明这一点的微基准测试结果)。因此,您已将变量移至较慢的内存,这也可能对性能产生负面影响,抵消高占用率带来的任何好处。

如果您还没有看过,我强烈推荐 Vasily Volkov 在 GTC 2010 上的演讲“较低占用率下的更好性能”(pdf) 。这里展示了如何利用指令级并行性以非常非常低的占用率将 GPU 吞吐量提高到非常高的水平。

关于cuda - 通过增加占用率来提高内核性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7737772/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com