性能指标通识:吞吐量、延迟、占用率、利用率等核心指标定义
在进入 GPU 内核剖析之前,必须先建立一套统一的“度量语言”。GPU 性能分析工具(如 Nsight Compute、Ncu)输出的指标多达数百项,但绝大多数都可以归纳为四个核心维度:吞吐量(Throughput)、延迟(Latency)、占用率(Occupancy)与利用率(Utilization)。这四个指标从不同视角描述 GPU 的工作状态,理解它们的定义、区别与联系,是后续定位性能瓶颈的基石。
核心原理:四个维度的定义与物理含义
吞吐量衡量单位时间内完成的工作量。在 GPU 语境下,常见的有“每秒浮点运算次数”(FLOPS)、“每秒事务数”或“每秒处理的线程块数”。它反映的是系统的生产能力。例如,一个内核的峰值吞吐量为 10 TFLOPS,但实际只达到 2 TFLOPS,说明计算资源未被充分利用。
延迟指从发出请求到收到结果之间的时间间隔。对于单个线程,延迟可能是从读取全局内存到数据返回的数百个时钟周期;对于整个内核,延迟则是从启动到完成的总耗时。延迟反映的是响应速度,与吞吐量并非简单的反比关系——高吞吐系统可能通过流水线掩盖高延迟。
占用率是 GPU 特有的指标,定义为活跃线程束(Warp)数量与硬件最大可容纳线程束数量的比值。它衡量的是 GPU 隐藏延迟的能力。高占用率意味着有足够多的独立线程束可以切换执行,从而掩盖内存访问或指令依赖带来的停顿。
利用率则是一个更宽泛的概念,通常指硬件单元(如 CUDA 核心、内存带宽、特殊功能单元)在给定时间内的忙碌比例。Ncu 中的“Compute (SM) Throughput”和“Memory Throughput”就是典型的利用率指标。利用率是结果,而占用率是手段之一。
方法流程:如何正确解读这些指标
在实际分析中,建议遵循以下流程,避免被单一指标误导:
- 确定瓶颈域:首先查看 Ncu 报告中的“Compute (SM) Throughput”与“Memory Throughput”。若两者均低于 60%,则可能存在延迟瓶颈或调度开销;若一方接近 90% 以上,则瓶颈明确。
- 检查占用率:查看“Achieved Occupancy”与理论最大占用率的差距。若实际占用率远低于理论值(例如理论 75%,实际仅 40%),通常意味着存在资源限制(寄存器溢出、共享内存超限)或线程块调度不均衡。
- 分析延迟隐藏:对于内存密集型内核,若占用率足够但内存吞吐量仍低,需检查是否存在内存访问模式问题(如非合并访问、存储体冲突),而非单纯增加占用率。
- 交叉验证:将“Duration”(内核总耗时)与“SM 利用率”结合——若 SM 利用率高但总耗时长,说明计算量大;若 SM 利用率低且总耗时长,则可能存在同步等待或负载不均。
案例场景:一个矩阵乘法的指标解读
假设我们分析一个 4096×4096 的矩阵乘法内核(使用朴素实现),Ncu 报告关键数据如下:
| 指标 | 数值 | 初步解读 |
|---|---|---|
| Duration | 12.5 ms | 总耗时偏长 |
| Compute (SM) Throughput | 38% | 计算单元大量空闲 |
| Memory Throughput | 72% | 内存带宽接近饱和 |
| Achieved Occupancy | 62% | 理论值 75%,有提升空间 |
| Global Load Efficiency | 45% | 存在大量非合并访问 |
分析结论:该内核是内存带宽受限,而非计算受限。SM 利用率仅 38% 是因为线程大部分时间在等待内存数据返回。占用率 62% 虽不算低,但全局加载效率仅 45%,意味着每个 128 字节缓存行中只有约一半数据被使用。此时盲目提高占用率(例如减小寄存器使用)收效甚微,正确方向是优化数据访问模式——使用共享内存分块(Tiling)或调整线程块遍历顺序,使加载效率接近 100%。
误区与复盘:指标误读的典型教训
误区一:追求 100% 占用率。高占用率意味着每个 SM 驻留大量线程,可能造成寄存器溢出(Spill)或缓存抖动。例如,一个内核若将占用率从 50% 提升到 100%,但导致每个线程的寄存器从 32 个增至 64 个并发生局部内存溢出,性能反而会下降 20%。
误区二:混淆“利用率”与“忙碌率”。SM 利用率 90% 并不代表所有 CUDA 核心都在做有效计算——可能大量线程在执行整数寻址运算或分支跳转,而浮点单元空闲。Ncu 会细分“FMA 利用率”“ALU 利用率”等,需按内核类型关注对应单元。
误区三:忽略“延迟”的构成。内存延迟并非单一数值。全局内存延迟约 400-800 周期,但若访问 L2 缓存命中则降至约 200 周期,L1 命中约 30 周期。分析时需结合“Mem Busy”与“Max Bandwidth”区分是带宽瓶颈还是延迟瓶颈——前者表现为队列满,后者表现为线程等待但带宽未饱和。
复盘建议:每次性能调优后,记录四类指标的变化。若修改后吞吐量提升但占用率下降,需确认是否因减少了冗余线程而提高了有效计算密度;若利用率提升但总耗时未降,则需检查是否引入了额外的同步开销。只有将四个指标联动分析,才能避免“按下葫芦浮起瓢”的优化困境。