【问题标题】:CUDA, how to choose <<<Blocks, Threads<>>?CUDA,如何选择<<<Blocks, Threads<>>?
【发布时间】:2012-09-30 09:06:50
【问题描述】:

在一个库中,我使用对多个 CUDA 内核的调用。我当然想得到最好的表现。用户使用库的方式可能会有所不同。

块/线程的数量对此有很大影响。

对于如何选择块/线程以获得最佳性能是否有一些规则?

例如(只是一个问题),最好选择块高,线程低?还是反过来? 还是最好使用 GetDeviceProperties() 中的一些值?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    您可以使用 NVIDIA 提供的依赖项calculator.xls 来选择[您必须尝试更改 xls 中线程和块的值] 最佳配置,在此配置上您可以获得最佳占用率,进而为您提供最佳配置表现。

    【讨论】:

    • “最好的入住率反过来给你最好的性能”的假设通常是不正确的。
    【解决方案2】:

    最好你希望在一个块中至少有一个完整的线程,否则你只会对可用的处理能力进行不良使用。此外,您通常希望一个块中的线程数能被 warp 大小整除。

    一个块中使用的线程总数取决于您的资源使用情况。原则上,您希望以大入住率为目标。这些限制由可用的共享内存和寄存器设置。如果您使用大量共享内存和/或寄存器,则可实现的最大占用率下降。然后,对每个块的线程数进行分析和微调是有意义的,直到找到一个最佳点,实现的占用率和理论占用率最大化,当然总占用率本身也尽可能接近 100%。

    根据经验,您希望在保持良好占用率的同时最大化每个块的线程数。在分析步骤中自动迭代一组可能的块/线程数组合以找到极值组合是完全有意义的。

    【讨论】:

    • 通常偶数条经线也是可取的。在计算能力 1.x 上,由于寄存器分配粒度,在更高的计算能力上,以便均匀地提供两个(CC 3.0 上四个)warp 调度程序。通常最好还是允许每个 SM 超过一个块,正如我刚刚写的 here
    • 让入住率接近 100% 不一定是最佳策略。请在此处查看 Paulius Micikevicius 的性能分析和优化演讲:bit.ly/OzutxO
    【解决方案3】:

    我认为这完全是经验。

    块和网格大小取决于很多因素,例如算法、每个线程的工作量、资源、延迟。

    在正常情况下,我会先制作为 256*256。并经常调整以选择更好的。

    为了避免银行冲突,他们会选择像 257 这样的块大小。

    有很多资源可以帮助您选择。 喜欢: 延迟和块大小 (http://www.lsr.nectec.or.th/images/e/e6/Cuda_Optimization2.pdf)

    无论如何,只要尝试更新它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多