文章

使用Nsight Compute分析Bank Conflict

使用Nsight Compute分析Bank Conflict

测试用例:github – cuda_perf

1. 启动配置

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

nsight-compute-metrics-full

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、全局内存的更高优先级访问)
  • 这些是硬件行为的自然结果

3. 参考资料

本文由作者按照 CC BY 4.0 进行授权