optimization - 优化有关寄存器的 CUDA 内核

标签 optimization cuda

我正在使用 CUDA 占用计算器来尝试优化我的 CUDA 内核。目前我使用 34 个寄存器和零共享内存......因此,每个块 310 个线程的最大占用率为 63%。当我可以以某种方式将寄存器(例如通过共享内存传递内核参数)更改为 20 或更低时,我可以获得 100% 的占用率。这是一个很好的方法,还是您会建议我使用其他优化路径?

此外,我还想知道是否有更新版本的 Compute Capability 2.1 占用计算器!?

最佳答案

需要考虑的几点:

  • 每个块 320 个线程将提供与 310 相同的占用率,因为占用率定义为每个 SM 的事件扭曲/最大扭曲,并且扭曲大小始终为 32 个线程。您应该从不 使用不是 32 的整数倍的块大小。这只会浪费内核和周期。
  • 内核参数在您的计算 2.1 设备上的常量内存中传递,它们对占用或寄存器使用没有影响。
  • GPU 设计的流水线延迟约为 21 个周期。因此,对于 Fermi GPU,您需要大约 43% 的占用率来覆盖所有内部调度延迟。一旦完成,您可能会发现尝试实现更高入住率的好处相对较小。
  • 争取 100% 的入住率通常从来都不是 build 性的优化目标。如果您还没有这样做,我强烈建议您查看 GTC 2010 "Better performance at lower occupancy" 中 Vasily Volkov 的演讲。 ,他展示了各种令人惊讶的结果,例如代码在 8% 的占用率下达到了 85% 的峰值内存带宽。
  • 最新的占用计算器不包括计算 2.1,但计算 2.0 的有效占用规则也适用于 2.1 设备。计算 2.1 多处理器中的额外内核通过指令级并行和几乎无序执行的方式发挥作用。与计算 2.0 设备相比,这确实根本不会改变设备的占用特性。
  • 关于optimization - 优化有关寄存器的 CUDA 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6056336/

    相关文章:

    基于Java的memcached客户端,优化将数据放入memcache

    java - 更新Map值的有效方法

    c++ - CUDA-Matlab 编译中 C++ 指针的问题

    c++ - 多个文件中的 Cuda 内核函数

    c++ - 在 C++ 和 CUDA 中 malloc 一个复杂的<float>

    c++ - 结构和包含相同字节的原始变量哪个更快?

    linux - 如何对子文件夹中的所有图像使用 ImageMagick 转换命令

    cuda - 如何使tensorflow在具有2.x功能的GPU上运行?

    c++ - Visual Studio调试优化如何工作?

    Cuda 将常量从设备复制到主机