【问题标题】:GPU Utilization InterpretationGPU利用率解读
【发布时间】:2014-09-10 12:35:15
【问题描述】:

我使用 NVIDIA Profiler 测试了一个内核,它输出以下内容:

我们已经启动了具有 256 个块和 256 个线程的内核。 据我了解,grafic 显示了三个部分,一个用于 Warps ,一个用于寄存器,一个用于共享内存,每个部分都有一个计算的“块限制”,其中寄存器部分中的一个是最小和最大的限制值. 显然内核是寄存器绑定的,我们只能在一个 SM 上同时启动 4 个块。这就是 Profiler 所说的。我完全在问自己以下问题:

一个GTX 780 Ti,一个SM有192个核心,怎么可能同时启动4个block * 256个线程= 1024个线程?在 CUDA 术语中,这个“同时”是什么意思?这是否意味着,可以在调度程序中同时调度 4 个块,并且 SM 以锁步方式从一个单个块的 warp 中执行指令。同时这个词有点混乱?

非常感谢

【问题讨论】:

  • 您当前使用的每个线程的寄存器数量限制了可以在一个SM上同时(同时)执行的块数量。因此 GPU 没有被充分利用。请记住,寄存器、块和线程之间的关系是三向关系。这个文档developer.download.nvidia.com/compute/cuda/… 可以帮助你。

标签: cuda nvidia


【解决方案1】:

GPU 是一个隐藏延迟的机器,而延迟隐藏涉及在每个周期/问题槽的各个执行单元上调度各种线程(指令)。为了最好地隐藏延迟,GPU 希望拥有比 SM 上的执行单元更多的可用线程来选择指令。

因此,在给定的周期中,可能只有 192 个(或更少,可能)由 warp 调度程序调度的执行单元,但在下一个周期/发布槽中,可以调度更多指令。为了促进这个过程,我们希望尽可能多的线程/warp/blocks“可用”用于调度。这里的“同时”是指在 SM 上“打开”并且“可调度”的线程/warp/块的数量。它不是指在任何问题槽中发出了多少实际指令,也不是指 SM 上的“核心”或“执行单元”的数量。

可以在任何给定时间在 SM 上“打开”的线程/warps/块的数量(以便可用于调度目的)可能会受到相关线程块的资源使用情况的限制。例如,具有高寄存器使用率的线程块可能会限制可以在 SM 上“打开”的线程块的总数,因为 SM 必须为每个“打开”的线程块分配一个完整的寄存器集。

由于 GTX 780 Ti 使用 GK110 GPU,GK110 white paper 可能会很有趣。

【讨论】:

  • 感谢您的精彩解释。您写道“但在下一个周期/问题时段,可以安排更多指令。” --> 更多是什么意思?安排了超过 192 条指令?如果是这样,由于有 192 个内核可用,一个块中最多只有 192 个线程可以同时执行一条指令仍然是真的吗?
  • GPU 执行单元是流水线的。 “更多”是指新指令(与之前发布的指令相比),而不是“超过 192 条”。由于先前发出的指令可能处于流水线执行的各个阶段,因此说“一个块中最多只能有 192 个线程可以同时执行一条指令”是不明智的。在任何给定时刻,各种指令都在流水线中执行。关于可以在单个周期/发布槽中发布什么,它仍然不是完全正确的,因为在一个 Kepler SM 中有超过 192 个执行单元。
  • 192 个“核心”大约指的是 SP 单元。除了 SP 单元之外,还有其他执行单元。但是只有 4 个 warp 调度器,每个调度器都可以双重发出一个 warp 的指令。所以最大理论上是 8*32 = 256 个线程指令发出。在实践中通常不会达到这个最大理论值。即使是这样,256 条线程指令也不可能都是同一类型(例如 SP 浮点乘法)。
猜你喜欢
  • 2013-05-13
  • 2018-07-04
  • 2020-11-27
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2020-11-08
  • 1970-01-01
相关资源
最近更新 更多