我使用 Nvidia visual profiler (nvvp) 在 cublas 内核上执行内核分析。此链接延迟分布是延迟分布结果。
该文件以这种方式解释了"指令已发出"一词-"发出指令-发出了Warp",这让我感到困惑。 这实际上意味着什么?
首先是关于 CUDA 执行模型的一些背景。
CUDA 扭曲是 CUDA GPU 上调度和执行的基本单元。 warp 是一起执行的 32 个线程的固定集合。
因此,在任何给定的时钟周期中,由 warp 中的一个线程执行的指令总是由 warp 中的所有其他线程执行(尽管它们可能被预测关闭或屏蔽为非活动状态,并且忽略 Volta 进行此讨论)。
CUDA 流多处理器 (SM) 具有调度程序,它们查看属于可用扭曲的各种执行线程,并从准备好的执行线程中选择指令,以在 SM 内的各个执行单元上调度这些指令。
然后发出的指令意味着 warp 调度程序选择一个指令,并将其发出(调度)到一组执行单元上进行处理。 说"指令已发出"实际上意味着,由于 CUDA 执行模型,该指令是在 warp 范围内发出的,这意味着它被调度到 32 个相关的执行单元上,以便为扭曲中的所有 32 个线程提供该指令。 我们可以说"该经线已发出",这意味着对经线中的所有 32 个线程发出了指令。
现在,关于分布饼图,您可能希望参考此处。
探查器使用 PC 采样来确定采样点处的翘曲状态,然后将如此采样的翘曲状态放入饼图分布图中,以显示对特定状态进行采样的时间百分比。
翘曲可以处于多种状态,我不打算尝试定义和总结它们。 但是许多状态将对应于"停止"状态,这意味着处于该状态的 warp 不能从中发出指令(例如,也许是因为下一个指令对先前发出的尚未完成的指令具有执行依赖性)。 "不停滞"状态,是"指令发出"。 (此处定义了翘曲状态。 从技术上讲,"未选择"是一种"停滞"状态,但我将在下面讨论它)。
从 Warp 的角度来看,"发出指令"可能是"最佳"状态。 在对翘曲进行采样的时钟周期中,它有一个准备调度的指令,事实上,实际上一个或多个指令实际上是从该翘曲发出的。
相比之下,"未选择"(技术上也是一种"失速"状态)是"准备"发出的翘曲,但由于某种原因,翘曲调度程序选择从另一个翘曲中选择指令以在采样的时钟周期中发出。