使用 Nsight Compute 进行 kernel 性能分析

编译时,加上 -lineinfo 参数,Nsight Compute 分析时,可以看到具体的 C++/cu 代码。

1. 查看 Warp State Statistics

Warp State Statistics 表征从执行/issue当前指令到执行/issue下一条指令之间的周期数。导致指令周期长的原因有多种,比如等待内存访问、指令流水线Stall等(一个方法是需要更多 warp 来掩盖指令延迟)。见官方文档https://docs.nvidia.com/nsight-compute/ProfilingGuide/index.html#sections-and-rules 并搜索 Warp State Statistics。

在 Warp State 图表中,有一个 Stall MIO Throttle 项,表示由于内存访问延迟,导致的指令 Stall:

nsight_warp_state_statistics

2. Bank Conflicts 分析

在 Memory Workload Analysis 这一节中,性能指标 Shared Load 这一行中,有如下几列,其含义如下表:

项目 解释
Instructions GMEM -> SMEM Load 指令总数
Requests GMEM -> SMEM Load 请求数,每条指令都会生成一个 Request
Wavefronts Wavefront 数量,一个 Wavefront 覆盖 128 字节数据

所以只要看 Requests / Wavefronts (>=1)比例,越低表示 Bank Conflicts 越多。从下图看,这两个值接近,即几乎 Warp 内每个线程之间都有 Bank Conflicts。

nsight_shared_memory_load

下一步,就是源码定位:

nsight_source_viewer

从左侧源码定位到 copy.hpp 文件中的 copy 函数,从右侧的汇编信息看到是 GMEM 加载,从右下角的窗口看其调用栈,最终定位到源码的第 144 行:

nsight_call_stack

查看 Bank Conflicts 是否严重,从 GPU Speed of Light 节中,查看 L1/TEX Cahce(%) 是否比较高,具体参考论坛帖子:Shared memory bank conflicts and nsight metric

相关资料:




    Enjoy Reading This Article?

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

  • al-folio 本地部署记录(Ubuntu 24.04)
  • C++ Traits
  • 道格拉斯-普克算法(Douglas–Peucker algorithm)
  • CMake支持库收集
  • QGC代码架构解析:飞行前检查(起飞条件)