Magnus Strengert | GTC2023 | 03/23/23
NVIDIA Nsight Suite 是一套综合性的开发者工具,用于优化应用程序在 NVIDIA GPU 上的性能。该套件包含多个关键组件:
Nsight Compute
Nsight Systems
Nsight Graphics
Nsight Deep Learning Designer
Nsight Compute 提供了多项功能,用于 GPU 核函数性能分析和优化:
更多信息请访问:https://developer.nvidia.com/nsight-compute
该演示展示了 Nsight Compute 用户界面中报告的导航和引导分析功能,包括性能吞吐量和内存图表等详细视图。
Nsight Compute 的最新版本和未来更新将引入以下功能,以进一步增强性能分析能力:
预计加速计算 (Estimated Speedup Calculations)
摘要页面工作流改进 (Summary Page Workflow Improvements)
基线值指标 (Baseline Value Indicators)
以下是关于调度器统计信息和预计加速的详细描述:
调度器统计 (Scheduler Statistics)
活动的调度器可以为每个核函数安排一个指令周期。每个调度器需要大约 2.3 个周期来执行一个指令。调度器能够最大化每个周期的输出,而不会导致硬件资源利用不足。这个核函数每天每个调度器都会发出一个平均 4.53 个活跃的 warp。活动的 warp 是需要执行指令的 warp 的子集。如果 warp 没有获得调度,它就会被添加到延迟队列中。
预计加速 (Estimated Speedup): 25.00%
此核函数理论上的占用率不应受任何块大小限制。计算出的理论占用率 (100.0%) 和测量的 warp 调度开销/工作负载之间的差异支持了核函数。负载不平衡会导致 warp 之间的块内或块间调度优化不足。
线程块的 warp 数量被定义为在一个给定 GPU 上可以执行的最大线程块数量。一个核函数运行期间的线程块总数为 30.1% 的情况,部分 warp 可能占总执行的 25.0% 的时间,总线程运行时间比一个较低的 30.1% 的利用率。这表明这种效应也会影响其他 warp。
Nsight Compute 的 Source Page 支持多种语言和配置,以实现精确的代码关联和性能分析:
支持的语言 (Supported Languages)
CUDA-C, Fortran, Python,...
PTX
SASS
代码关联 (Code Correlation)
Generating Line-Table Information! 进行编译。-lineinfo。@njit(lineinfo=True)。收集 SourceCounters 部分(“Full”集的一部分) (Collect SourceCounters section (part of 'Full' set))
该演示展示了 Source Page 的详细功能,包括如何在源代码级别进行导航、查看代码与性能指标的关联以及进行指标交互分析。
此幻灯片展示了NVIDIA Nsight Compute软件界面的实时演示,聚焦于“已执行指令指标”。界面详细展示了源代码、不同线程块和线程数量下的指令执行计数、以及与程序地址关联的指令执行统计数据。这些指标有助于识别活跃的代码路径以及由于不活跃线程和线程发散导致的效率低下。
Warp 停顿聚合的数据收集方法涉及对程序计数器 (PC) 和 Warp 停顿的采样。
PC 和 Warp 停顿采样
--sampling-interval 参数手动配置。smsp_pcsamp_interval_cycles 捕获。每个 SM 每 N 个周期
对于该 Warp 输出样本,包含:
停顿原因:
Warp 调度器在该周期是否发出了指令的位信息。
上图展示了一个 SM (GA10x) 的结构,其中包含 SMSP0 到 SMSP3 四个子处理器,每个子处理器又包含 12 个 Warp 槽位(W0-W11)。图例区分了“活跃 Warp”和“未使用的 Warp 槽位”。
样本计数
smsp_cycles_active.maxdevice_attribute_multiprocessor_countsmsp_pcsamp_interval_cyclessmsp_pcsamp_sample_countsmsp_cycles_active.max / smsp_pcsamp_interval_cycles * device_attribute_multiprocessor_count与详细页面上的停顿原因指标的比较
smsp_stall_sum 的总和:smsp_cycles_active.sum * smsp_warps_active.avg_per_cycle_activesmsp_warps_active.sum在案例研究中,展示了具体指标值及其计算过程。
样本计数
smsp_cycles_active.max) = 657,043device_attribute_multiprocessor_count) = 46smsp_pcsamp_interval_cycles) = 1,024smsp_pcsamp_sample_count) = 29,046smsp_cycles_active.max / smsp_pcsamp_interval_cycles * device_attribute_multiprocessor_count) = 29,515与详细页面上的停顿原因指标的比较
* 未采样
* 聚合硬件计数器
* 所有 Warp 调度器上每个活跃 Warp 在每个周期内的停顿原因总和。
* 所有 smsp_stall_sum 的总和 (smsp_cycles_active.sum * smsp_warps_active.avg_per_cycle_active) = 1,217,807,035
以下表格展示了具体的指标名称、单位和值:
基于上述数据,计算得到的聚合停顿估计值如下:
* 采样计数:29,046
* 每个活跃周期的平均活跃 Warp 数:10.12
* 采样间隔:1,024
* 每个 SM 的 Warp 调度器数量:4
* 估计的聚合停顿数:1,223,441,612
此幻灯片展示了NVIDIA Nsight Compute软件界面的实时演示,聚焦于“Warp 停顿聚合”和“L2 内存指标”。界面详细展示了与Warp停顿原因和L2内存访问相关的各种指标,例如Load/Store操作、访问延迟等。
已执行指令指标
* 识别已执行的代码路径。
* 检测因不活跃线程和线程发散导致的效率低下。
Warp 停顿聚合
* 高样本计数是高延迟/高成本的指示器。
* 仅在 Issue Slot Utilization 不接近 100% 时才进行调查。
* 停顿样本通常聚合在依赖指令上,而非“慢速”指令本身。
内存指标
* 过多的扇区计数(全局/局部)和内存体冲突(共享)表明有改进潜力。
* 确认核函数是否受内存限制。
* 查阅详细信息页面以分析 L1TEX 和 L2 缓存的影响。
* 牢记“每执行指令的超额消耗”。
* 优先处理频繁执行且存在效率低下的指令。
本幻灯片展示了一个实时演示,重点介绍了以下功能:
* 函数级统计 (Per-Function Statistics)
* 相对指标模式 (Relative Metric Modes)
* 内联函数表 (Inline Function Table)
演示界面左侧显示了代码视图,右侧则展示了汇编指令及其相关的性能指标,包括每指令执行次数(Instructions Executed)、占空比(Occupancy)等。界面中还可以看到详细的指令地址、源行、指令和操作数,以及全局(Global)和共享(Shared)内存访问信息,帮助用户深入分析代码性能。
以下是源页面的主要总结要点:
在编译阶段启用代码关联以获得所有优势:
sum()。max() 函数。在关注高级语言的同时,对生成的汇编代码的基本理解会有所帮助:
利用源页面的多种指标聚合和过滤功能:
NVIDIA Nsight Compute 将在源页面中引入以下未来功能亮点:
每源行引导式分析 (Guided Analysis per Source Line)
初步检测到的问题 (Initially Detected Issues)
通过现有规则系统完全可定制 (Fully Customizable through existing Rules System)
右侧的截图展示了 Nsight Compute 界面如何通过在代码行旁边的黄色感叹号标记来突出显示检测到的性能问题,并提供关于这些问题的描述和相关建议。
开发者工具在最新版本的 CUDA Toolkit 中是免费提供的:
支持通过以下途径获得:
更多信息:
会议 (Sessions)
实验 (Labs)
与专家联系 (Connect with Experts)