Nsight 性能分析工具
NVIDIA Nsight 是专业的 GPU 性能分析工具套件,包�?Nsight Systems(系统级)和 Nsight Compute(Kernel 级),是定位 GPU 性能瓶颈的必备工具�?
Nsight 工具家族
| 工具 | 用�? | 分析粒度 |
|---|---|---|
| Nsight Systems | 系统级时间线分析 | CPU/GPU 整体 |
| Nsight Compute | Kernel 级深度分�? | 单个 Kernel |
| Nsight Graphics | 图形渲染分析 | 图形 API |
| cuda-gdb | GPU 调试�? | 代码�? |
Nsight Systems �?系统级分�?
Nsight Systems 提供 CPU �?GPU 活动�?时间线视�?,用于发现宏观性能问题�?
命令行使�?
bash
# 基本分析
nsys profile -o my_report ./my_app
# 详细选项
nsys profile \
--trace=cuda,nvtx,osrt \ # 追踪 CUDA、NVTX 标注、OS 运行�?
--gpu-metrics-device=0 \ # GPU 指标
--output=report \
--force-overwrite=true \
./my_app args
# 查看报告(命令行�?
nsys stats report.nsys-rep
# 打开 GUI
nsys-ui report.nsys-repNVTX 标注
在代码中添加 NVTX 标注,让时间线更易读�?
cpp
#include <nvtx3/nvToolsExt.h>
void trainEpoch(int epoch) {
// 标注范围
nvtxRangePushA("Forward Pass");
forwardPass();
nvtxRangePop();
nvtxRangePushA("Backward Pass");
backwardPass();
nvtxRangePop();
nvtxRangePushA("Optimizer Step");
optimizerStep();
nvtxRangePop();
}
// 带颜色的标注
nvtxEventAttributes_t attrs = {0};
attrs.version = NVTX_VERSION;
attrs.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
attrs.colorType = NVTX_COLOR_ARGB;
attrs.color = 0xFF76B900; // NVIDIA �?
attrs.messageType = NVTX_MESSAGE_TYPE_ASCII;
attrs.message.ascii = "My Kernel";
nvtxRangePushEx(&attrs);
myKernel<<<grid, block>>>(args);
nvtxRangePop();常见问题诊断
时间线分析要点:
1. GPU 空闲时间
症状:GPU 时间线有大量空白
原因:CPU 瓶颈、数据传输等待、同步点过多
2. 内存传输占比过高
症状:H2D/D2H 传输时间 > Kernel 时间
优化:使�?Stream 重叠、减少传输量、使用统一内存
3. Kernel 启动开销
症状:大量短 Kernel,每�?< 10 μs
优化:合�?Kernel、使�?CUDA Graph
4. 同步点过�?
症状:cudaDeviceSynchronize 频繁出现
优化:使�?Stream �?Event 替代全局同步Nsight Compute �?Kernel 级分�?
Nsight Compute 提供单个 Kernel �?*硬件计数�?*数据,精确定位性能瓶颈�?
命令行使�?
bash
# 基本分析(收集所有指标)
ncu --set full -o kernel_report ./my_app
# 只分析特�?Kernel
ncu --kernel-name myKernel --set full -o report ./my_app
# 指定分析哪次调用(第2次调用)
ncu --kernel-name myKernel --launch-skip 1 --launch-count 1 \
--set full -o report ./my_app
# 查看报告
ncu-ui kernel_report.ncu-rep关键指标解读
SM 利用率(Compute Throughput�?
SM Active Cycles / Total Cycles
目标�? 80%
低于 50%:可能存在内存瓶颈或 Occupancy 不足内存吞吐量(Memory Throughput�?
实际带宽 / 峰值带�?
目标�? 70%(内存密集型 Kernel�?
低于 50%:可能存在非合并访问�?Cache MissOccupancy(占用率�?
活跃 Warp �?/ SM 最�?Warp �?
目标�? 50%(不是越高越好)
影响因素:寄存器数量、共享内存大小、Block 大小Warp 效率
Warp Execution Efficiency = 活跃线程�?/ (32 × Warp �?
目标�? 90%
低于 80%:存�?Warp Divergence 或边界条件浪�?Roofline 分析
Nsight Compute 内置 Roofline 模型,直观显�?Kernel 的性能上限�?
Roofline 图解读:
峰值算�?─────────────────────────────────────────
�?
�? �?内存带宽受限区域
�?
�?
─────╱──────────────────────────────────────────
�?
Ridge Point(转折点�?
= 峰值算�?/ 峰值带�?
A100: 19.5 TFLOPS / 2 TB/s = 9.75 FLOP/Byte
如果 Kernel 的点在左侧(内存受限):
�?优化内存访问模式、增加数据复�?
如果 Kernel 的点在右侧但低于屋顶(计算受限但未达峰值)�?
�?提高 Occupancy、减�?Warp Divergence内存访问分析
bash
# 收集内存相关指标
ncu --metrics \
l1tex__t_bytes_pipe_lsu_mem_global_op_ld.sum,\
l1tex__t_bytes_pipe_lsu_mem_global_op_st.sum,\
l1tex__average_t_sectors_per_request_pipe_lsu_mem_global_op_ld.ratio \
./my_app关键内存指标�?
| 指标 | 含义 | 理想�? |
|---|---|---|
| Global Load Efficiency | 有效加载字节 / 总加载字�? | 100% |
| L1 Hit Rate | L1 Cache 命中�? | > 80% |
| L2 Hit Rate | L2 Cache 命中�? | > 60% |
| Sectors per Request | 每次请求�?Cache Line �? | 1(完全合并) |
实际分析工作�?
Step 1:Nsight Systems 找宏观问�?
�?确认 GPU 利用率、找出最耗时�?Kernel
Step 2:Nsight Compute 分析目标 Kernel
�?查看 Roofline 定位瓶颈类型
Step 3:根据瓶颈类型深入分�?
内存受限 �?查看 Memory Workload Analysis
计算受限 �?查看 Compute Workload Analysis
延迟受限 �?查看 Scheduler Statistics
Step 4:修改代码,对比前后指标
Step 5:重复直到达到目标性能性能分析实战案例
案例:矩阵转置优�?
bash
# 分析朴素转置
ncu --set full -o naive_transpose ./transpose naive
# 关键发现�?
# Global Store Efficiency: 6.25%(非合并写入!)
# L2 Hit Rate: 12%(大�?Cache Miss�?
# 优化后(使用共享内存�?
ncu --set full -o opt_transpose ./transpose optimized
# 优化后指标:
# Global Store Efficiency: 100%
# L2 Hit Rate: 85%
# 性能提升�?.5x常用 ncu 指标速查
bash
# Occupancy
ncu --metrics sm__warps_active.avg.pct_of_peak_sustained_active
# 内存带宽利用�?
ncu --metrics gpu__dram_throughput.avg.pct_of_peak_sustained_elapsed
# Tensor Core 利用�?
ncu --metrics sm__pipe_tensor_cycles_active.avg.pct_of_peak_sustained_active
# Warp 分歧
ncu --metrics smsp__thread_inst_executed_pred_on.avg,\
smsp__warps_launched.avg性能优化目标参�?
| 指标 | �? | 一�? | �? | 优秀 |
|---|---|---|---|---|
| SM 利用�? | < 30% | 30-60% | 60-80% | > 80% |
| 内存带宽利用�? | < 30% | 30-60% | 60-80% | > 80% |
| Occupancy | < 25% | 25-50% | 50-75% | > 75% |
| L1 命中�? | < 40% | 40-70% | 70-90% | > 90% |
| 合并访问效率 | < 50% | 50-80% | 80-95% | > 95% |
总结
性能优化是一个迭代过程:测量 �?分析 �?优化 �?验证。不要过早优化,先用 Nsight Systems 找到真正的瓶颈,再用 Nsight Compute 深入分析,针对性地优化才能事半功倍�?