Become Faster in Writing Performant CUDA Kernels using the Source Page in Nsight Compute

Magnus Strengert | GTC2023 | 03/23/23

目录

  1. NVIDIA Nsight 套件概览
  2. Nsight Compute 详解
    1. 功能概览 (2023.1.0 / CUDA 12.1)
    2. 现场演示:报告导航与引导分析
    3. 未来功能亮点
  3. Source Page 核心指标分析
    1. 现场演示:指令执行指标 (Instructions Executed Metrics)
    2. Warp Stalls Aggregates (Warp 暂停聚合)
    3. 现场演示:Warp Stalls Aggregates 和 L2 Memory Metrics
    4. Source Page Metrics 总结
  4. Source Page 高级功能与最佳实践
    1. 现场演示:函数级统计、相对指标模式和内联函数表
    2. 源页面使用总结
    3. 源页面未来功能亮点
  5. GTC'23 开发者工具与相关资源

1. NVIDIA Nsight 套件概览

NVIDIA Nsight 是一套工具,旨在帮助开发者调试和优化其应用程序。该套件包括:

  • Nsight Compute: 一款用于 CUDA® 和 NVIDIA OptiX™ 的交互式性能分析器,通过用户界面和命令行提供详细的性能指标和 API 调试功能。
  • Nsight Systems: 提供应用程序性能的系统级可视化,帮助开发者优化瓶颈,以便在任意数量和规模的 CPU 和 GPU 上高效扩展。
  • Nsight Graphics: 一款独立的开发者工具,支持光线追踪,使开发者能够调试、分析和导出使用 Direct3D、Vulkan、OpenGL、OpenVR 和 Oculus SDK 构建的帧。
  • Nsight Deep Learning Designer: 一个集成的端到端开发环境,帮助开发者高效设计和开发用于应用内推理的深度神经网络。它包括推理过程的性能分析和交互式可视化分析。

这些工具可以协同工作。例如,开发者可以使用 Nsight Systems 进行系统级分析以识别 GPU 瓶颈,然后深入到 Nsight Compute 对特定的 CUDA 核函数进行详细分析,或使用 Nsight Graphics 调试图形 API 调用。

2. Nsight Compute 详解

本次演讲的重点是 Nsight Compute,这是一款用于 CUDA 和 OptiX 应用程序的交互式性能分析器。

Page 4, 重点介绍 Nsight Compute
Page 4, 重点介绍 Nsight Compute

2.1 功能概览 (2023.1.0 / CUDA 12.1)

Nsight Compute 提供了丰富的功能,帮助开发者理解和优化其核函数:

Page 5, Nsight Compute 功能概览
Page 5, Nsight Compute 功能概览

  • GPU Kernel Profiler (GPU 核函数性能分析器): 提供命令行和用户界面两种方式进行分析。
  • CUDA/OptiX API Stepper (CUDA/OptiX API 步进器): 支持资源追踪和 NVTX (NVIDIA Tools Extension) 范围标记。
  • Detailed Performance Report (详细性能报告): 按范围、图或核函数展示指标。
  • Source Correlation (源代码关联): 将性能指标和归因关联到每一行源代码。
  • Guided Analysis (引导分析): 自动检测问题并提供优化建议。
  • Warp Per Scheduler (每个调度器的 Warp 状态): 显示每个调度器中 Warp 的状态和停滞原因。
  • OptiX Acceleration Structure (OptiX 加速结构): 提供加速结构的检查和可视化。
  • Documentation & Samples (文档与示例): 包含性能分析指南和指标知识库。

2.2 现场演示:报告导航与引导分析

本节通过现场演示展示了如何使用 Nsight Compute 的报告界面进行导航,并利用其引导分析功能来识别性能瓶颈。

Page 6, Nsight Compute 界面演示
Page 6, Nsight Compute 界面演示

2.3 未来功能亮点

Nsight Compute 即将推出多项新功能,旨在进一步提升用户体验和分析效率。

Page 7, Nsight Compute 未来功能亮点
Page 7, Nsight Compute 未来功能亮点

  • 预估加速计算 (Estimated Speedup Calculations)

    • 为检测到的问题明确指出潜在的性能提升空间。
    • 允许用户根据影响/重要性对规则进行排序,快速定位最关键的性能瓶颈。
  • 摘要页面工作流改进 (Summary Page Workflow Improvements)

    • 指标值的可视化展示。
    • 完全可定制的指标列,用户可以根据需要选择显示哪些指标。
    • 提供跳转到详情页面的链接,方便深入分析。
  • 基线值指示器 (Baseline Value Indicators)

    • 快速识别性能变化最大的指标("highest movers")。
    • 提供多种颜色选择,便于区分和比较。

3. Source Page 核心指标分析

3.1 现场演示:指令执行指标 (Instructions Executed Metrics)

这张幻灯片展示了 NVIDIA Nsight Compute 工具的界面,这是一个现场演示,重点关注“指令执行指标”。该界面集成了源代码、汇编代码以及性能指标,帮助开发者分析 CUDA 内核的执行情况。

  • 源代码视图 (Source View):左侧面板显示了 CUDA 内核的 C++ 源代码。每一行代码旁边都关联了性能数据,例如已执行指令数(Instructions Executed)。
  • 指令执行指标 (Instructions Executed Metrics):中间的条形图和右侧的表格量化了每条源代码/汇编指令的执行频率。这有助于识别代码中的热点路径(hotspots)。
  • 汇编代码视图 (Source Pane):右侧面板展示了与源代码对应的 PTX/SASS 汇编指令,并提供了更细粒度的性能指标,如线程执行情况(Thread Instructions Executed)和谓词化执行情况(Predicated-on Thread Instructions Executed)。

Nsight Compute 指令执行指标界面演示 (Page 16)
Nsight Compute 指令执行指标界面演示 (Page 16)

3.2 Warp Stalls Aggregates (Warp 暂停聚合)

数据收集 (Data Collection)

Warp 暂停聚合指标通过对程序计数器 (PC) 和 Warp 暂停状态进行采样来收集数据。

  • 采样率 (Sampling Rate):
    • 采用固定的、预配置的采样率。
    • 默认配置会尝试找到最高采样率,同时避免跳过采样或导致缓冲区溢出。
    • 可以通过 --sampling-interval 参数手动配置。
    • 采样间隔以 smsp__pcsamp_interval_cycles 指标的形式记录在报告中。

SM 架构示意图 (Page 17)
SM 架构示意图 (Page 17)

  • 采样流程:
    对于每个流式多处理器 (SM),在每第 N 个周期执行以下步骤:
    1. 在 SM 上选择一个 Warp 调度器 (Warp Scheduler)。
    2. 在该 Warp 调度器上随机选择一个活跃的 Warp (Active Warp)。
    3. 为选中的 Warp 输出以下采样信息:
      • 当前的程序计数器 (PC)。
      • 暂停原因 (Stall Reason)
        • 如果 Warp 不符合执行条件:则记录具体原因,如 Barrier (栅栏), Branch_Resolving (分支解析), Dispatch (分派), Drain (耗尽), LG (局部/全局), Long_Sb_Math, Membar, MIO (多输入输出), Misc (其他), No_Inst (无指令), Short_Sb, Sleep, Tex (纹理), Wait (等待)。
        • 如果 Warp 符合执行条件但未发射:Not_Selected (未被选中)。
        • 如果 Warp 在该周期发射了指令:Selected (被选中)。
      • 记录 Warp 调度器在该周期是否发射了指令的标志位。

Warp 暂停采样流程图示 (Page 21)
Warp 暂停采样流程图示 (Page 21)

指标背景 (Metric Background)

  • 采样计数 (Sample Count):

    • 内核持续时间: smsp__cycles_active.max
    • SM 数量: device__attribute_multiprocessor_count
    • 采样间隔: smsp__pcsamp_interval_cycles
    • 实际采样数: smsp__pcsamp_sample_count
    • 估算采样数公式: smsp__cycles_active.max / smsp__pcsamp_interval_cycles * device__attribute_multiprocessor_count
  • 与详情页中“暂停原因”指标的比较:

    • 详情页的指标不是通过采样获得的。
    • 它们是聚合硬件计数器,对所有 Warp 调度器上每个活跃 Warp 在每个周期内的暂停原因进行求和。
    • 所有 smsp__stall_*_sum 指标的总和可以通过以下两种方式近似计算:
      • smsp__cycles_active.sum * smsp__warps_active.avg.per_cycle_active
      • smsp__warps_active.sum

案例研究 (Example Case Study)

本案例展示了如何使用上述指标进行分析。

  • 估算采样数:
  • smsp__cycles_active.max = 657,043 周期
  • device__attribute_multiprocessor_count = 46 个 SM
  • smsp__pcsamp_interval_cycles = 1,024 周期
  • 估算值 = 657,043 / 1,024 * 46 ≈ 29,515 次采样
  • 实际值 smsp__pcsamp_sample_count = 29,046 次采样,与估算值非常接近。

  • 估算总暂停周期:

  • smsp__cycles_active.sum * smsp__warps_active.avg.per_cycle_active ≈ 1,214,398,035
  • smsp__warps_active.sum = 1,217,807,035
  • 两者结果相近,验证了指标的有效性。

  • 聚合暂停估算:

  • 采样总数: 29,046
  • 每个活跃周期的平均活跃 Warp 数: 10.12
  • 采样间隔: 1,024
  • 每个 SM 的 Warp 调度器数量: 4
  • 估算的聚合暂停 ≈ 1,223,441,612

案例研究中的指标计算 (Page 27)
案例研究中的指标计算 (Page 27)

3.3 现场演示:Warp Stalls Aggregates 和 L2 Memory Metrics

此演示展示了 Nsight Compute 中更深入的分析视图,结合了 Warp 暂停聚合、L2 内存指标以及寄存器依赖关系。

  • Warp 暂停采样 (Warp Stall Sampling):界面显示了与每条汇编指令相关的不同暂停原因的采样计数,例如 Long Scoreboard (长记分板) 和 MIO Throttle (MIO 节流)。
  • 寄存器依赖 (Register Dependencies):可视化了指令之间的数据依赖关系,帮助开发者理解导致长记分板暂停的根本原因。
  • L2 理论/实际吞吐量 (L2 Theoretical/Actual Throughput):显示了 L2 缓存的理论带宽和实际使用带宽,用于分析内存瓶颈。

Nsight Compute 中 Warp 暂停和 L2 指标的演示 (Page 28)
Nsight Compute 中 Warp 暂停和 L2 指标的演示 (Page 28)

3.4 Source Page Metrics 总结

本节总结了在 Nsight Compute 的 Source Page(源代码页)上可用的关键指标类别及其用途。

  • 指令执行指标 (Instructions Executed Metrics)

    • 目的:识别已执行的代码路径。
    • 用途:检测由非活跃线程和线程分歧(thread divergence)导致的低效率。
  • Warp 暂停聚合 (Warp Stalls Aggregates)

    • 高采样数:表示高延迟或高成本。
    • 调查时机:仅当“发射槽利用率 (Issue Slot Utilization)”远低于 100% 时才需要深入调查。
    • 关键洞察:暂停采样通常聚合在依赖于慢速指令的后续指令上,而不是慢速指令本身。
  • 内存指标 (Memory Metrics)

    • 潜在改进信号:过多的扇区计数(sector count,针对 global/local 内存)和 Bank 冲突(针对 shared 内存)。
    • 确认问题:确认内核是否受内存带宽限制。
    • 深入分析:查阅详情页 (Details Page) 以分析 L1TEX 和 L2 缓存的影响。
    • 优化思路:关注“每次执行指令的超额量 (excesses per executed instruction)”。
    • 优化优先级:优先处理执行频率高且效率低的指令。

Source Page Metrics 总结 (Page 29)
Source Page Metrics 总结 (Page 29)

4. Source Page 高级功能与最佳实践

Source Page 高级功能标题页 (Page 30)
Source Page 高级功能标题页 (Page 30)

4.1 现场演示:函数级统计、相对指标模式和内联函数表

该页面展示了 NVIDIA Nsight Compute 工具的实时演示截图,重点介绍了其在源代码、SASS 指令集和性能指标之间进行关联分析的能力。

Page 31
Page 31

演示界面分为几个关键部分:
- 左侧: 显示高级语言(如 Python 或 C++)的源代码。
- 中间: 展示了内联函数表、函数级统计数据以及指标的相对模式。
- 右侧: 详细列出了与源代码行对应的 SASS(Shader Assembly)指令。每一行 SASS 指令都附有详细的性能指标,例如“已执行指令数”(Instructions Executed)和“停顿采样”(Stall Sampling),并以百分比形式展示了其在全局(Global)和共享(Shared)资源中的占比。

该演示旨在说明 Nsight Compute 如何帮助开发者直观地理解其高级代码在 GPU 上的底层执行情况,并精确定位性能瓶颈。

4.2 源页面使用总结

Page 32
Page 32

Page 33
Page 33

  • 在编译阶段启用代码关联以获得全部优势

    • 高级语言的指标是从所有相关的 SASS 指令中聚合而来的。
    • 默认的聚合函数是 sum(),用于计算所有相关 SASS 指令的指标总和。
    • 一个例外是活跃寄存器(Live Registers)指标,它使用 max() 函数。
  • 在关注高级语言的同时,对生成的汇编代码有基本的理解将大有裨益

    • ... 了解应用了或遗漏了哪些优化。
    • ... 深入了解高级指令的复杂性/成本。
    • ... 对源指标设定正确的预期。
      • 控制流的实现会显著改变指标和性能。
      • 停顿(stall)的影响通常首先在相关的指令上显现。
      • 利用寄存器依赖关系列进行分析。
  • 使用源页面提供的多种指标聚合和过滤功能

    • 主要挑战是在海量数据中识别问题。
    • 利用指标热图、内联函数分解、函数级统计、指标占总数的百分比分解等功能。
    • 从“详情页面”(Details Page)开始,带着特定的指标目标进入源分析。
    • 使用“指标组”(Metric Groups)在不同的指标集之间快速切换和聚焦。

4.3 源页面未来功能亮点

Page 34
Page 34

  • 按源代码行进行引导式分析 (Guided Analysis per Source Line)

    • 高亮显示检测到性能问题的代码行。
    • 快速导航到有问题的源代码行。
    • 关联表:
      • 提供更多细节。
      • 支持排序和过滤。
  • 初步可检测的问题:

    • 带有过多扇区(excessive sectors)的全局/局部内存访问。
    • 存在库冲突(bank conflicts)的共享内存访问。
    • 具有高停顿分析采样数的指令。
  • 完全可通过现有的规则系统 (Rules System) 进行定制

5. GTC'23 开发者工具与相关资源

Page 35
Page 35

  • 开发者工具是免费的,并已打包在最新版本的 CUDA Toolkit 中。
  • 下载链接: https://developer.nvidia.com/cuda-downloads

  • 技术支持可通过以下途径获取:

  • https://forums.developer.nvidia.com/c/development-tools/

  • 更多信息请访问:

  • https://developer.nvidia.com/tools-overview

  • 相关会议 (Sessions)

  • SS1205: 从宏观到微观 - CUDA 开发者工具在任何规模下查找和修复问题
  • SS1421: 规模化优化:调查和解决多节点工作负载的隐藏瓶颈
  • SS1882: 使用 Nsight Compute 的源页面更快地编写高性能 CUDA 核函数
  • S51772: 调试 CUDA:CUDA 正确性工具概述
  • S51230: Orin 性能实体构建与 Nsight 开发者工具
  • SE52434: Jetson Edge AI 开发者日:使用 NVIDIA Nsight 开发者工具充分利用您的 Jetson Orin

  • 实验课程 (Labs)

  • DLITS1143: 使用 Nsight 分析工具高效掌握常见优化模式
  • DLITS1202: 调试和分析 CUDA 应用程序的正确性
  • DLITS1580: 使用 Nsight Graphics 和 Nsight Systems 进行光线追踪开发

  • 与专家交流 (Connect with Experts)

  • CWES52036: 您的 CUDA 工具箱中有哪些新功能?用于最新架构的 CUDA 分析、优化和调试工具
  • CWES52009: 使用您的 NVIDIA 开发者工具来优化光线追踪

Page 36
Page 36