性能指标通识:吞吐量、延迟、占用率、利用率等核心指标定义

在进入 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”就是典型的利用率指标。利用率是结果,而占用率是手段之一。

关键区别:占用率是“软件可配置的隐藏延迟能力”,利用率是“硬件实际忙碌的观测结果”。高占用率不一定带来高利用率——如果所有线程都在访问同一内存分区导致冲突,SM 依然会停顿。
GPU 性能四维指标关系图 延迟 (Latency) 单次请求 → 响应的时间 单位:ns / cycle 例:全局内存延迟 ~400 cycles 影响:单线程响应速度 吞吐量 (Throughput) 单位时间完成的工作量 单位:FLOPS / Bytes/s 例:SM 峰值 128 FMA/cycle 影响:整体生产能力 占用率 (Occupancy) 活跃 Warp 数 / 硬件最大 Warp 数 公式: Occupancy = ActiveWarps / MaxWarps 受限于:寄存器数、共享内存、线程块大小 作用:隐藏延迟的“弹药储备” 利用率 (Utilization) 硬件单元忙碌时间占比 观测对象: CUDA Core / LSU / 内存带宽 Ncu 中显示为 % 的吞吐量 反映:硬件实际忙碌程度 高延迟需 高占用掩盖 高吞吐依赖 高利用率 占用率是 手段 利用率是 结果 分析路径:先看利用率瓶颈 → 再查占用率是否足够 → 结合延迟与吞吐量定位根因

方法流程:如何正确解读这些指标

在实际分析中,建议遵循以下流程,避免被单一指标误导:

  1. 确定瓶颈域:首先查看 Ncu 报告中的“Compute (SM) Throughput”与“Memory Throughput”。若两者均低于 60%,则可能存在延迟瓶颈或调度开销;若一方接近 90% 以上,则瓶颈明确。
  2. 检查占用率:查看“Achieved Occupancy”与理论最大占用率的差距。若实际占用率远低于理论值(例如理论 75%,实际仅 40%),通常意味着存在资源限制(寄存器溢出、共享内存超限)或线程块调度不均衡。
  3. 分析延迟隐藏:对于内存密集型内核,若占用率足够但内存吞吐量仍低,需检查是否存在内存访问模式问题(如非合并访问、存储体冲突),而非单纯增加占用率。
  4. 交叉验证:将“Duration”(内核总耗时)与“SM 利用率”结合——若 SM 利用率高但总耗时长,说明计算量大;若 SM 利用率低且总耗时长,则可能存在同步等待或负载不均。
实用技巧:Ncu 的“Speed of Light”页面会直接给出 SM 利用率和内存利用率的“光线图”。当两者都未达到 80% 时,优先检查“Warp Stall”原因——Ncu 会分类显示等待内存、等待固定资源、等待分支等不同停顿原因。

案例场景:一个矩阵乘法的指标解读

假设我们分析一个 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%。

常见误区:看到“Compute Throughput 低”就认为是占用率不足。实际上,对于内存受限内核,即使占用率达到 100%,SM 利用率依然不会高——因为计算单元无数据可算。必须先判断瓶颈域,再对症下药。

误区与复盘:指标误读的典型教训

误区一:追求 100% 占用率。高占用率意味着每个 SM 驻留大量线程,可能造成寄存器溢出(Spill)或缓存抖动。例如,一个内核若将占用率从 50% 提升到 100%,但导致每个线程的寄存器从 32 个增至 64 个并发生局部内存溢出,性能反而会下降 20%。

误区二:混淆“利用率”与“忙碌率”。SM 利用率 90% 并不代表所有 CUDA 核心都在做有效计算——可能大量线程在执行整数寻址运算或分支跳转,而浮点单元空闲。Ncu 会细分“FMA 利用率”“ALU 利用率”等,需按内核类型关注对应单元。

误区三:忽略“延迟”的构成。内存延迟并非单一数值。全局内存延迟约 400-800 周期,但若访问 L2 缓存命中则降至约 200 周期,L1 命中约 30 周期。分析时需结合“Mem Busy”与“Max Bandwidth”区分是带宽瓶颈还是延迟瓶颈——前者表现为队列满,后者表现为线程等待但带宽未饱和。

复盘建议:每次性能调优后,记录四类指标的变化。若修改后吞吐量提升但占用率下降,需确认是否因减少了冗余线程而提高了有效计算密度;若利用率提升但总耗时未降,则需检查是否引入了额外的同步开销。只有将四个指标联动分析,才能避免“按下葫芦浮起瓢”的优化困境。

核心记忆点:吞吐量是目标,延迟是代价,占用率是手段,利用率是结果。分析时先看利用率找瓶颈,再看占用率查原因,最后结合延迟与吞吐量验证优化方向。