GPU利用率解读

Gab*_*iel 1 cuda nvidia

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

在此输入图像描述

我们启动了具有 256 个块和 256 个线程的内核。据我了解,该图显示了三个部分,一个用于 Warps ,一个用于寄存器,一个用于共享内存,每个部分都有一个计算出的“块限制”,其中寄存器部分中的部分是最小且最有限制的值。显然,内核是寄存器绑定的,我们只能在一个 SM 上同时启动 4 个块。这就是探查器所说的。我彻底问自己以下事情:

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

多谢

Rob*_*lla 5

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

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

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

由于 GTX 780 Ti 使用 GK110 GPU,因此GK110 白皮书可能会令人感兴趣。