使用 Nsight Compute 进行 kernel 性能分析

测试用例:github – cuda_perf

  • 编译时,加上 -lineinfo 参数,Nsight Compute 分析时,可以看到具体的 C++/cu 代码。
  • 另外一篇性能分析文章:CUDA 架构(1.1):Hopper架构及性能分析(ncu) + 性能优化

1. 启动配置

使用Nsight Compute运行被测试CUDA程序,启动时,指定metricsfull

nsight-compute-metrics-full

1.1. 命令行方式

# 完整分析,输出到文件
ncu --set full -o gemm_sm80_profile ./ncu_gemm_sm80 4096 4096 4096

# 查看 memory 相关指标
ncu --set memory ./ncu_gemm_sm80 4096 4096 4096

# 查看 compute 相关指标
ncu --set compute ./ncu_gemm_sm80 4096 4096 4096

# 查看 roofline
# 1. Memory Throughput(GB/s)、L2 Cache Throughput(GB/s)、Compute (SM) Throughput(TFLOPS/s)
# 结果以百分比形式给出,即与理论峰值的比值
# 2. SM Active Cycles / Elapsed Cycles,他们的比值表示 SM 的利用率,即可以看出等待内存的时间占比
ncu --set roofline ./ncu_gemm_sm80 4096 4096 4096

# 查看 occupancy 相关指标
ncu --section Occupancy ./cu_gemm_sm80.exe 4096 4096 4096

# 查看 shared memory bank conflict
ncu --metrics l1tex__data_bank_conflicts_pipe_lsu_mem_shared,l1tex__data_bank_conflicts_pipe_lsu_mem_shared_op_ld.sum ./ncu_gemm_sm80 4096 4096 4096

2. 分析Bank Conflicts

被测试CUDA程序运行结束后,打开Nsight Compute的结果页面(Details),进入Memory Workload Analysis章节,在章节标题右侧,选择Memory Tables,查看Shared Memory部分:

nsight-compute-shared-memory-bank-conflict

Details页面里显示的Shared MemoryBank Conflicts信息,由于其测量数据来源于硬件计数器,还可能包括仲裁冲突(arbitration conflicts):

  • LDGSTSFill Return(全局/共享内存加载的返回数据)
  • TMAFill Return(Tensor Memory Accelerator的返回数据)
  • Tensor Core对共享内存的读取

使用Source页面的L1 Wavefonts Shared Excessive结果,应该更准确:

nsight-compute-source-l1-wavefronts-shared-excessive

两个页面分析结果为什么会有差异?

指标 数据来源 测量内容 用途
Details Page 硬件计数器 Bank Conflict + 仲裁冲突 实际性能影响
Source Page 代码分析 纯粹的 Bank Conflict 代码优化

如何识别可优化的Bank Conflict:

  • 使用源页面(Source View)的Excessive计数器
  • 这些是由地址发散和真实的Bank Conflict引起的
  • 这些可以通过代码优化来消除

哪些冲突无法修复:

  • 详情页面中显示的仲裁冲突无法通过代码优化解决
  • 这些是系统级别的问题(Tensor Core、TMA、全局内存的更高优先级访问)
  • 这些是硬件行为的自然结果

A. 参考资料




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • al-folio 模板定制修改总结
  • al-folio 本地部署记录(Ubuntu 24.04)
  • C++ Traits
  • 道格拉斯-普克算法(Douglas–Peucker algorithm)
  • CMake支持库收集