Become Faster in Writing Performant CUDA Kernels using the Source Page in Nsight Compute
Become Faster in Writing Performant CUDA Kernels using the Source Page in Nsight Compute
Magnus Strengert | GTC2023 | 03/23/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 应用程序的交互式性能分析器。
2.1 功能概览 (2023.1.0 / CUDA 12.1)
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 的报告界面进行导航,并利用其引导分析功能来识别性能瓶颈。
2.3 未来功能亮点
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)。
3.2 Warp Stalls Aggregates (Warp 暂停聚合)
数据收集 (Data Collection)
Warp 暂停聚合指标通过对程序计数器 (PC) 和 Warp 暂停状态进行采样来收集数据。
- 采样率 (Sampling Rate):
- 采用固定的、预配置的采样率。
- 默认配置会尝试找到最高采样率,同时避免跳过采样或导致缓冲区溢出。
- 可以通过
--sampling-interval参数手动配置。 - 采样间隔以
smsp__pcsamp_interval_cycles指标的形式记录在报告中。
- 采样流程:
对于每个流式多处理器 (SM),在每第 N 个周期执行以下步骤:- 在 SM 上选择一个 Warp 调度器 (Warp Scheduler)。
- 在该 Warp 调度器上随机选择一个活跃的 Warp (Active Warp)。
- 为选中的 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 调度器在该周期是否发射了指令的标志位。
指标背景 (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_activesmsp__warps_active.sum
案例研究 (Example Case Study)
本案例展示了如何使用上述指标进行分析。
- 估算采样数:
smsp__cycles_active.max= 657,043 周期device__attribute_multiprocessor_count= 46 个 SMsmsp__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,035smsp__warps_active.sum= 1,217,807,035-
两者结果相近,验证了指标的有效性。
-
聚合暂停估算:
- 采样总数: 29,046
- 每个活跃周期的平均活跃 Warp 数: 10.12
- 采样间隔: 1,024
- 每个 SM 的 Warp 调度器数量: 4
- 估算的聚合暂停 ≈ 1,223,441,612
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 缓存的理论带宽和实际使用带宽,用于分析内存瓶颈。
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)”。
- 优化优先级:优先处理执行频率高且效率低的指令。
4. Source Page 高级功能与最佳实践
4.1 现场演示:函数级统计、相对指标模式和内联函数表
该页面展示了 NVIDIA Nsight Compute 工具的实时演示截图,重点介绍了其在源代码、SASS 指令集和性能指标之间进行关联分析的能力。
演示界面分为几个关键部分:
- 左侧: 显示高级语言(如 Python 或 C++)的源代码。
- 中间: 展示了内联函数表、函数级统计数据以及指标的相对模式。
- 右侧: 详细列出了与源代码行对应的 SASS(Shader Assembly)指令。每一行 SASS 指令都附有详细的性能指标,例如“已执行指令数”(Instructions Executed)和“停顿采样”(Stall Sampling),并以百分比形式展示了其在全局(Global)和共享(Shared)资源中的占比。
该演示旨在说明 Nsight Compute 如何帮助开发者直观地理解其高级代码在 GPU 上的底层执行情况,并精确定位性能瓶颈。
4.2 源页面使用总结
-
在编译阶段启用代码关联以获得全部优势
- 高级语言的指标是从所有相关的 SASS 指令中聚合而来的。
- 默认的聚合函数是
sum(),用于计算所有相关 SASS 指令的指标总和。 - 一个例外是活跃寄存器(Live Registers)指标,它使用
max()函数。
-
在关注高级语言的同时,对生成的汇编代码有基本的理解将大有裨益
- ... 了解应用了或遗漏了哪些优化。
- ... 深入了解高级指令的复杂性/成本。
- ... 对源指标设定正确的预期。
- 控制流的实现会显著改变指标和性能。
- 停顿(stall)的影响通常首先在相关的指令上显现。
- 利用寄存器依赖关系列进行分析。
-
使用源页面提供的多种指标聚合和过滤功能
- 主要挑战是在海量数据中识别问题。
- 利用指标热图、内联函数分解、函数级统计、指标占总数的百分比分解等功能。
- 从“详情页面”(Details Page)开始,带着特定的指标目标进入源分析。
- 使用“指标组”(Metric Groups)在不同的指标集之间快速切换和聚焦。
4.3 源页面未来功能亮点
-
按源代码行进行引导式分析 (Guided Analysis per Source Line)
- 高亮显示检测到性能问题的代码行。
- 快速导航到有问题的源代码行。
- 关联表:
- 提供更多细节。
- 支持排序和过滤。
-
初步可检测的问题:
- 带有过多扇区(excessive sectors)的全局/局部内存访问。
- 存在库冲突(bank conflicts)的共享内存访问。
- 具有高停顿分析采样数的指令。
-
完全可通过现有的规则系统 (Rules System) 进行定制。
5. GTC'23 开发者工具与相关资源
- 开发者工具是免费的,并已打包在最新版本的 CUDA Toolkit 中。
-
技术支持可通过以下途径获取:
-
更多信息请访问:
-
相关会议 (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 开发者工具来优化光线追踪