摘要/结论
- 宏观定性:使用 GPU Speed Of Light Throughput 查看算子在计算单元和内存系统的吞吐利用率。Sol throughput 指标会显示计算与内存各自的利用率;计算高说明算子计算密集,内存高说明内存带宽是瓶颈。若二者都低于 60% 表示延迟隐藏有问题。
- 资源瓶颈:通过 Occupancy & Scheduler Statistics 判断硬件资源是否限制了延迟隐藏。理论占用率由 SM 中最大可并行的 warps(线程束)决定,而实际占用率反映活跃 warps 的平均值;如果理论占用率很低,通常是寄存器或共享内存限制。调度器的 Eligible Warps 显示有多少 warps 准备好发出指令;若该值接近 0 则说明没有足够的工作隐藏延迟。
- 深度拆解:在 Warp Stall Reasons、Memory Workload Analysis 和 Compute Workload Analysis 中定位瓶颈。Stall Long Scoreboard 表示等待全局/纹理/表面加载;Stall Barrier 表示线程束在同步点等待;通过 L1/L2 Hit Rate 判断缓存利用效率;Pipe Utilization 显示算子使用的 ALU/FMA/Tensor 单元占比。
- 精准定位:最后利用 Workload Distribution 观察各 SM/SM Scheduler 的负载均衡,使用 Source Counters 将 stall 百分比映射到具体的源代码行。热点行具有高 stall 百分比或低 branch 效率,结合上一阶段的瓶颈判断可确定优化目标。
<aside>
总体流程是:先看宏观吞吐确定算子属于计算绑定还是内存绑定;再分析资源限制和调度器状态,确认有无足够并行度;接着深入查找具体 stall 类型、缓存命中率和指令流水线利用率;最后追踪到不平衡的工作分布和源代码行,从而制定针对性的优化措施。
</aside>
具体内容
一、宏观体检:GPU Speed Of Light Throughput
Nsight Compute 的 Speed Of Light Throughput 报告提供了计算和内存吞吐率的高层视图,每个单元的数值表示实际吞吐与理论峰值的百分比。高吞吐率意味着相应单元充分利用,而低吞吐率表示资源闲置或延迟隐藏失败。建议按以下步骤解读:
- 比较 compute vs memory throughput:计算吞吐占比更高表示算子计算密集;内存吞吐占比高则说明内存带宽是主要瓶颈。若二者都低,说明 GPU 未“喂饱”,可能存在长延迟未被隐藏。
- 延迟警告:当计算与内存吞吐都低于 60% 时,需要查看下一级的调度器和占用率,确认是工作量太小还是瓶颈导致 stall 多。
- 配合 Roofline 图:Nsight Compute 还提供 roofline 分析,根据算子的算术强度(AI=flops/byte)判断理论性能上限。若算子位于带宽受限区,可考虑数据复用或算子融合提升 AI;若算子位于计算受限区,则需优化算法或并行度。
二、资源瓶颈分析:Occupancy 与 Scheduler Statistics
为了隐藏内存和执行延迟,GPU 需要有足够数量的活跃 warps。Nsight Compute 的 Occupancy 部分显示理论和实际占用率:
- 理论占用率 (sm__maximum_warps_per_active_cycle_pct):由 SM 能支持的最大 warps 数量与 launch 配置决定。
- 实际占用率:实际活跃 warps 平均值,低于理论值通常是寄存器或共享内存数量限制引起的,或者 grid/block 配置不合理。
Scheduler Statistics 提供调度器层面的视图:
- Active Warps/Scheduler 表示调度器手中持有的活跃 warps 数;
- Eligible Warps/Scheduler 是准备执行的 warps 数;若该值接近 0 ,说明大部分 warps 正在等待数据或同步;
- Issued Warps/Scheduler 表示实际发出的 warp 数,现代 GPU 通常每个周期最多可发出 1–2 个 warp。若发射率较低,应查看 warp stall 原因。