【问题标题】:Causes of Low Achieved Occupancy入住率低的原因
【发布时间】:2018-10-14 19:02:50
【问题描述】:

Nvidia web-site 提到了导致占用率低的几个原因,其中包括块之间的工作负载分布不均,这导致块囤积共享内存资源并且直到块完成才释放它们。建议是减小块的大小,从而增加块的总数(当然,假设我们保持线程数不变)。

stackoverflow 上的here 也对此给出了很好的解释。

鉴于上述信息,正确的做法不应该是(为了最大限度地提高性能)简单地将块的大小设置为尽可能小(等于 warp 的大小,比如 32 个线程)吗?也就是说,除非您需要确保大量线程需要通过共享内存进行通信,否则我假设。

【问题讨论】:

    标签: cuda gpgpu


    【解决方案1】:

    鉴于上述信息,不应该是正确的做法 动作是(为了最大化性能)简单地设置大小 块尽可能小(等于经线的大小,比如 32 线程)?

    没有。

    如文档here 中所示,每个多处理器的块数存在限制,这将使您在使用 32 个线程块时的最大理论占用率为 25% 或 50%,具体取决于您运行的硬件内核打开。

    【讨论】:

    • 明白。然后让我重新表述一下。既然我们还确认了每个 SM 的最大块数的限制,我们是否应该选择尽可能小的块大小?
    • 这样做的唯一好处是在同一个内核中的块可以有非常不同的执行时间的情况下。那么额外的粒度可以帮助负载平衡,否则这样做没有意义
    【解决方案2】:

    通常使用尽可能小的块是一种好方法,但要足够大以使设备饱和(每个块有 64 或 128 个线程,具体取决于设备) - 这并不总是可行的,因为您可能希望同步线程或通过共享进行通信记忆。

    拥有大量小块允许 GPU 进行某种“自动平衡”并保持所有 SM 运行。

    这同样适用于 CPU - 如果您有 5 个独立任务并且每个任务需要 4 秒才能完成,但您只有 4 个内核,那么它​​将在 8 秒后结束(在前 4 秒内,4 个内核在前 4 个任务上运行,并且然后 1 个核心在最后一个任务上运行,3 个核心处于空闲状态)。 如果您能够将整个工作划分为 20 个需要 1 秒的任务,那么整个工作将在 5 秒内完成。因此,拥有大量小任务有助于利用硬件。

    在 GPU 的情况下,您可以拥有大量活动块(在 Titan X 上,它是 24 SM x 32 个活动块 = 768 个块),并且可以很好地使用此功能。 无论如何,您需要使设备完全饱和并不总是正确的。在许多任务中,我可以看到每个块使用 32 个线程(因此有 50% 的可能占用率)与每个块使用 64 个线程的性能相同。 最后,只需进行一些基准测试,并在给定硬件的特定情况下选择最适合您的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2016-01-31
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多