Pipe Utilization管道利用率
概述
CUDA设备的每个流式多处理器(SM)都具有许多专门用于执行特定任务的硬件单元。在芯片级,这些单元提供执行管道,翘曲调度程序将指令发送到这些管道。例如,结构单元提供执行结构获取和执行结构过滤的功能。加载/存储单元获取数据并将其保存到内存中。了解这些管道的利用率并了解它们与目标设备的峰值性能有多接近,是分析内核执行效率的关键信息;还可以确定由于超标订购特定类型的管道而导致的性能瓶颈。
背景
开普勒GK110白皮书和NVIDIA GeForce GTX 680白皮书都描述并比较了最新CUDA计算设备的架构细节。下表简要总结了SM的单位计数及其每个周期对应的管道吞吐量:
对于这些体系结构吞吐量数字,管道利用率指标报告运行时每个管道的观察利用率。高管道利用率表明,在内核执行期间,相应的计算资源被大量使用并且经常处于忙碌状态。低值表示管道不经常使用,资源闲置。单个管道的结果彼此独立;将两个或多个管道利用率百分比相加不会产生有意义的值。由于管道度量报告为内核启动期间的平均值,因此低值不一定排除管道在内核执行期间的某个时间点是瓶颈。
算术指令由多个管道执行,如前表中32位浮点指令和特殊函数操作的两个示例所示。这些管道提供了非常不同的吞吐量,反过来导致了本地算术指令的不同吞吐量,如CUDA C编程指南所述。对于本实验支持的CUDA设备,这些运算吞吐量为:
根据定义,指令吞吐量表示每个SM每个周期可以处理多少操作。换言之,与指令吞吐量较低的操作相比,具有高吞吐量的操作的发出成本更低。算术工作负载使用这个简化的成本模型,通过加权发出的指令计数和相应的反向指令吞吐量。这样做可以评估哪种类型的算术指令占整个处理成本的多少。这对于算术管道利用率高的内核来说尤其有用,以确定哪类算术操作可能达到了可用吞吐量限制。
Charts
Pipe Utilization |
显示在内核执行期间SMs的四个主要逻辑管道的平均利用率。有助于调查管道是否被超额订阅,从而限制了内核的性能。这也有助于估计添加更多的工作是否能够很好地扩展,或者是否会达到管道限制。在这种情况下,增加更多的工作可能是指增加更多的算术工作负载(例如,通过提高某些计算的准确性)、增加内存操作的数量(包括引入寄存器溢出),或者增加每个SM的活动扭曲数目的目的是改进指令延迟隐藏。
报告的值是内核执行期间的平均值。低利用率并不保证管道在内核执行期间的某个时刻不会被超额订阅。
Metrics
Load / Store
加载/存储包括所有发出的指令,这些指令触发对目标设备的内存系统的请求,不包括结构操作。负责全局、本地、共享内存以及任何原子操作的加载和存储操作。还包括泄漏登记。计算能力3.5及更高版本的设备支持通过只读数据缓存(LDG)加载全局内存;这些操作不影响加载/存储组,而是在结构管道利用率中考虑。在高负载/存储利用率的情况下,收集内存实验以获得有关执行的内存操作的类型、计数和效率的更多信息。
结构覆盖所有执行结构提取的已发出指令,对于计算能力为3.5及更高版本的设备,通过只读数据缓存(LDG)加载全局内存。如果这个指标很高,请运行内存-结构实验来更详细地评估执行的结构请求。
控制流包括所有对控制流有影响的已发出指令,如分支指令(BRA、BRX)、跳转指令(JMP、JMX)、函数调用(CAL、JCAL)、循环控制指令(BRK、CONT)、返回指令(RET)、程序终止(EXIT)和屏障同步(BAR)。有关这些单独指令的详细信息,请参阅“指令集参考”。如果控制流利用率很高,请运行分支统计实验;这有助于了解控制流对总体内核执行性能的影响。
算术涵盖所有发出的浮点指令、整数指令、转换操作和移动指令。请参阅“指令集参考”,以获取这些组中每个组的汇编指令的详细列表。如果算术管道利用率很高,请检查算术工作负载图,以确定成本最高的指令类型。
Arithmetic Workload
提供各种算术指令的估计成本分布。成本模型是基于问题计数加权相应的指令吞吐量的倒数。指令类与本文背景部分给出的算术吞吐量表的行相匹配。
算术指令由芯片上的多个流水线执行,这些流水线可以并行运行。因此,算术工作负载分布并不是流水线利用率图表所示算术流水线百分比的真实划分;然而,成本估计值最高的指令类型很可能导致最高的片上流水线利用率。
All references to individual assembly instructions in the following metric descriptions refer to the native instruction set architecture (ISA) of CUDA devices as further described in the Instruction Set Reference.
FP32 Estimated workload for all 32-bit floating-point add (
FADD
), multiply (
FMUL
), multiply-add (
FMAD
) instructions.
FP64 Estimated workload for all 64-bit floating-point add (
DADD
DMUL
DMAD
FP32 (Special) Estimated workload for all 32-bit floating-point reciprocal (
RCP
), reciprocal square root (
RSQ
), base-2 logarithm (
LG2
), base 2 exponential (
EX2
), sine (
SIN
), cosine (
COS
I32 (Add) Estimated workload for all 32-bit integer add (
IADD
), extended-precision add, subtract, extended-precision subtract, minimum (
IMNMX
), maximum instructions.
I32 (Mul) Estimated workload for all 32-bit integer multiply (
IMUL
IMAD
), extended-precision multiply-add, sum of absolute difference (
ISAD
), population count (
POPC
), count of leading zeros, most significant non-sign bit (
FLO
).
I32 (Shift) Estimated workload for all 32-bit integer shift left (
SHL
), shift right (
SHR
), funnel shift (
SHF
I32 (Bit) Estimated workload for all 32-bit integer bit reverse, bit field extract (
BFE
), bit field insert (
BFI
Logical Ops Estimated workload for all logical operations (
LOP
Shuffle Estimated workload for all warp shuffle (
SHFL
Conv (From I8/I16 to I32) Estimated workload for all type conversions from 8-bit and 16-bit integer to 32-bit types (subset of
I2I
Conv (To/From FP64) Estimated workload for all type conversions from and to 64-bit types (subset of
I2F
,
F2I
, and
F2F
Conv (All Other) Estimated workload for all all other type conversions (remaining subset of
I2I
I2F
F2I
F2F
Analysis
如果装载/储存管道利用率高…
…运行内存实验,寻找超出每个请求的理想事务数的内存操作;改进这些非最佳内存访问可以减少加载/存储管道的负载。
…考虑是否可以通过使用不同的实现或不同的算法来减少执行的内存操作的总数。
…并且单个线程访问内存中的连续值,确保使用最宽的内存访问类型来执行操作。例如,如果每个线程需要读取128字节的连续内存,那么在一次128字节的访问中读取数据要比执行4次32字节的访问要好。为此,请使用内置向量类型。
…并且内存统计-本地实验显示本地内存请求数很高,可以打印PTX优化汇编程序的代码生成统计信息(--ptxas options=-v)以获得溢出字节数;如果高,请尝试通过更改内核启动的执行配置或启动边界来减少溢出。
如果纹理管道利用率高…
…运行内存统计-纹理实验,并研究纹理提取的效率。
…考虑是否可以通过使用不同的实现或不同的算法来减少执行的纹理操作的总数。还要检查内核是否已经接近目标设备的预期峰值纹理性能。
如果控制流管道利用率高…
…进行分支统计实验。在低控制流效率和高流量控制发散的情况下,尝试以最小化翘曲发散为目标重新组合核心网格的线程。
人工智能芯片与自动驾驶