【问题标题】:Maximum number of resident threads per multiprocessor VS. Maximum number of resident blocks per multiprocessor每个多处理器 VS 的最大驻留线程数。每个多处理器的最大驻留块数
【发布时间】:2013-06-17 19:27:43
【问题描述】:

我在我的 K20 上运行了一个关于具有并发内核执行的资源的问题。我的流只有一点重叠,然后我认为这可能是因为资源限制。于是我查阅了手册,发现:每个多处理器的最大驻留块数为 16,每个多处理器的最大驻留线程数为 2048。

所以我的问题是:如果我在每个块中有 96 个块的 1024 个线程的内核。这个内核将并行使用多少个 SM?

答案 1:96/16 = 6

答案 2:1024/2048*96 = 48(K20 只有 13 个 SM,那么这个内核会如何表现?)

或者你有其他答案?

【问题讨论】:

    标签: cuda hpc


    【解决方案1】:

    每个 SM 使用的块数取决于以下内容。

    1. 对每个 SM 块数的硬性限制。
    2. 每个块的线程数。
    3. 每个块的共享内存量。
    4. 每个块使用的寄存器数。

    假设共享内存和寄存器不是限制因素,让我们看几个案例。

    案例 1 每个块 32 个线程和 64 个块。

    仅查看线程数就可以得到 64 个块和 1 个 SM 的答案。但是每个 SM 有 16 个块的硬性限制。在这种情况下,(2)不是限制性约束,但(1)是。所以每个 SM 有 16 个块,使用了 4 个 SM。

    案例 2 每个块 1024 个线程和 32 个块。

    在这种情况下,(2) 是限制因素。每个 SM 只能有 2048 个线程,每个 SM 有 2 个块和使用 16 个 SM(显然会涉及一些块切换)。

    案例 3 每个块 1024 个线程,96 个块。 如问题中所述

    与上述类似,(2) 是限制因素。每个 SM 只使用 2 个块。 理论上需要 48 个 SM。在任何给定点只有 26 (13x2) 个块是“活动的”。 CUDA 应该注意将不活动的块与需要处理的块进行切换。

    TL;DR 为您提供每个 SM 的块数较少的约束是限制性约束。

    【讨论】:

      【解决方案2】:

      引用CUDA C Programming Guide

      对于给定内核,可以在多处理器上驻留和一起处理的块和扭曲的数量取决于内核使用的寄存器和共享内存的数量以及多处理器上可用的寄存器和共享内存的数量。

      还有每个多处理器的驻留块的最大数量和驻留扭曲的最大数量。这些限制以及多处理器上可用的寄存器和共享内存的数量是设备计算能力的函数,并在附录 F 中给出。如果每个多处理器没有足够的寄存器或共享内存来处理至少一个块,内核将无法启动。

      因此,您最好谈谈每个多处理器的最大块数,因为正如指南所说,实际数量取决于使用的寄存器数量和共享内存。

      对于您提到的情况,我会说内核将同时使用所有 SM,这些 SM 最多将托管 2 块,同时驻留在卡上的 26 个块。

      我推荐以下参考:

      Shane Cook,CUDA 编程,使用 GPU 进行并行计算的开发人员指南,第 5 章和第 9 章,策略 4,寄存器使用。

      【讨论】:

        猜你喜欢
        • 2013-07-13
        • 2020-08-06
        • 2014-04-26
        • 2012-07-18
        • 2019-12-01
        • 1970-01-01
        • 2017-10-09
        • 2020-07-01
        • 2013-07-22
        相关资源
        最近更新 更多