Skip to content

Nsight 性能分析工具

NVIDIA Nsight 是专业的 GPU 性能分析工具套件,包�?Nsight Systems(系统级)和 Nsight Compute(Kernel 级),是定位 GPU 性能瓶颈的必备工具�?

Nsight 工具家族

工具用�?分析粒度
Nsight Systems系统级时间线分析CPU/GPU 整体
Nsight ComputeKernel 级深度分�?单个 Kernel
Nsight Graphics图形渲染分析图形 API
cuda-gdbGPU 调试�?代码�?

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-rep

NVTX 标注

在代码中添加 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 Miss

Occupancy(占用率�?

活跃 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 RateL1 Cache 命中�?> 80%
L2 Hit RateL2 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 深入分析,针对性地优化才能事半功倍�?

基于 NVIDIA CUDA 官方文档整理