【问题标题】:CUDA block size and grid size for changing hardware用于更改硬件的 CUDA 块大小和网格大小
【发布时间】:2019-07-09 22:53:30
【问题描述】:

想象一下,我开发了一个 CUDA 内核并调整了块大小和网格大小,以在我的机器上获得最佳性能。但是,如果我将我的应用程序提供给具有不同 GPU 的客户,他可能需要对网格大小和块大小进行其他设置才能获得最佳性能。 如何在运行时更改网格大小和块大小,以便我的内核在不同 GPU 上运行最佳?

【问题讨论】:

    标签: performance cuda


    【解决方案1】:

    当您更改网格大小时,您正在更改线程总数。因此,关注总线程数,主要目标是您正在运行的 GPU 的最大运行中线程承载能力。

    寻求最大限度地利用其运行的 GPU 的 GPU 代码应该尝试至少拥有那么多线程。更少可能是坏事,更多可能不会有很大的不同。

    这个目标很容易计算。对于大多数 GPU,它是 GPU 中 SM 数量的 2048 倍。 (Turing GPUs have reduced the maximum thread load per SM from 2048 to 1024)。

    您可以在运行时通过调用cudaGetDeviceProperties()(研究deviceQuery 示例代码)找出GPU 中的SM 数量。

    知道 SM 的数量后,将其乘以 2048。这就是要在网格中启动的线程数。在这个调整/近似级别,应该不需要更改每个块的调整线程数。

    确实,你的具体代码可能无法在每个SM上真正实现2048线程(这个和occupancy的讨论有关)。然而,对于一个简单的目标,这不会有任何伤害。如果您已经知道代码的实际占用能力,或者已经使用occupancy API 来确定它,那么您可以将目标从每个 SM 2048 个线程缩减到某个较低的数字。但这种缩减可能不会显着提高代码的性能(如果有的话)。

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2015-07-25
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多