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

Magnus Strengert | GTC2023 | 03/23/23

目录


NVIDIA Nsight Suite 概述

NVIDIA Nsight Suite 是一套综合性的开发者工具,用于优化应用程序在 NVIDIA GPU 上的性能。该套件包含多个关键组件:

  • Nsight Compute

    • 交互式分析器,用于 CUDA® 和 NVIDIA OptiX™,通过用户界面和命令行工具提供详细的性能指标和 API 调试功能。
  • Nsight Systems

    • 提供应用程序性能的系统级可视化,以便在任意数量和大小的 CPU 和 GPU 上高效扩展瓶颈。
  • Nsight Graphics

    • 独立的开发者工具,支持光线追踪,可以调试、分析和导出使用 Direct3D、Vulkan、OpenGL、OpenVR 和 Oculus SDK 构建的帧。
  • Nsight Deep Learning Designer

    • 一个集成的端到端开发环境,帮助开发者高效设计和开发深度神经网络,用于应用内推理。包括推理分析和推理过程的交互式可视化分析。

Nsight Compute 2023.1.0 / CUDA 12.1 概述

Nsight Compute 提供了多项功能,用于 GPU 核函数性能分析和优化:

  • GPU Kernel Profiler:提供命令行和 UI 界面。
  • CUDA/OptiX API Stepper:支持资源追踪 / NVTX。
  • Detailed Performance Report:按范围、图形或核函数显示指标。
  • Source Correlation:按代码行显示指标和归因。
  • Guided Analysis:提供问题检测和建议。
  • Optix Acceleration Structure:支持检查和查看。
  • Documentation & Samples:包含性能分析指南和指标知识库。

更多信息请访问:https://developer.nvidia.com/nsight-compute

Nsight Compute 功能概述
Nsight Compute 功能概述

现场演示:报告导航与引导分析 (Live Demo: Report Navigation and Guided Analysis)

该演示展示了 Nsight Compute 用户界面中报告的导航和引导分析功能,包括性能吞吐量和内存图表等详细视图。

报告导航与引导分析演示
报告导航与引导分析演示

NVIDIA Nsight Compute - 即将推出的功能亮点

Nsight Compute 的最新版本和未来更新将引入以下功能,以进一步增强性能分析能力:

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

    • 指定检测到问题的潜在收益。
    • 通过影响/重要性进行排序。
  • 摘要页面工作流改进 (Summary Page Workflow Improvements)

    • 指标可视化。
    • 完全可定制的指标列。
    • 链接到详细信息页面。
  • 基线值指标 (Baseline Value Indicators)

    • 快速识别最重要的移动点。
    • 多种颜色选择。

以下是关于调度器统计信息和预计加速的详细描述:

  • 调度器统计 (Scheduler Statistics)
    活动的调度器可以为每个核函数安排一个指令周期。每个调度器需要大约 2.3 个周期来执行一个指令。调度器能够最大化每个周期的输出,而不会导致硬件资源利用不足。这个核函数每天每个调度器都会发出一个平均 4.53 个活跃的 warp。活动的 warp 是需要执行指令的 warp 的子集。如果 warp 没有获得调度,它就会被添加到延迟队列中。

    • 每个调度器活跃 Warp:69.63
    • 每个调度器最大 Warp:30.37
    • Issue Slot Utilization (Estimated Speedup): 69.63%
  • 预计加速 (Estimated Speedup): 25.00%
    此核函数理论上的占用率不应受任何块大小限制。计算出的理论占用率 (100.0%) 和测量的 warp 调度开销/工作负载之间的差异支持了核函数。负载不平衡会导致 warp 之间的块内或块间调度优化不足。
    线程块的 warp 数量被定义为在一个给定 GPU 上可以执行的最大线程块数量。一个核函数运行期间的线程块总数为 30.1% 的情况,部分 warp 可能占总执行的 25.0% 的时间,总线程运行时间比一个较低的 30.1% 的利用率。这表明这种效应也会影响其他 warp。

NVIDIA Nsight Compute 未来功能亮点
NVIDIA Nsight Compute 未来功能亮点

Source Page 基础 (Source Page Basics)

Source Page - 应用程序配置 (Application Configuration)

Nsight Compute 的 Source Page 支持多种语言和配置,以实现精确的代码关联和性能分析:

  • 支持的语言 (Supported Languages)

    • CUDA-C, Fortran, Python,...

      • 引用并加载基于行信息(Line-Table Information)。
      • 可以在编译时或稍后嵌入报告中。
    • PTX

      • 可用,如果编译链的一部分且嵌入到 CUBIN 中。
    • SASS

      • 始终可用并捕获。
      • 数据收集本身发生在汇编级别。
  • 代码关联 (Code Correlation)

    • 确保使用 Generating Line-Table Information! 进行编译。
    • 不改变生成的汇编代码。
    • 能够将指标聚合到高级语言。
    • NVCC 选项-lineinfo
    • NVC, NVC++, NVFortran:默认启用。
    • NUMBA Python@njit(lineinfo=True)
  • 收集 SourceCounters 部分(“Full”集的一部分) (Collect SourceCounters section (part of 'Full' set))

Source Page 应用程序配置
Source Page 应用程序配置

现场演示:Source Page 导航、关联和指标交互 (Live Demo: Source Page Navigation, Correlation, and Metric Interaction)

该演示展示了 Source Page 的详细功能,包括如何在源代码级别进行导航、查看代码与性能指标的关联以及进行指标交互分析。

Source Page 导航、关联和指标交互演示
Source Page 导航、关联和指标交互演示

Source Page 指标 (Source Page Metrics)

实时演示:已执行指令指标 (Live Demo: Instructions Executed Metrics)

实时演示:已执行指令指标
实时演示:已执行指令指标

此幻灯片展示了NVIDIA Nsight Compute软件界面的实时演示,聚焦于“已执行指令指标”。界面详细展示了源代码、不同线程块和线程数量下的指令执行计数、以及与程序地址关联的指令执行统计数据。这些指标有助于识别活跃的代码路径以及由于不活跃线程和线程发散导致的效率低下。

Warp 停顿聚合:数据收集

Warp 停顿聚合的数据收集方法涉及对程序计数器 (PC) 和 Warp 停顿的采样。

  • PC 和 Warp 停顿采样

    • 采用固定的、预配置的采样率。
    • 默认配置尝试在不跳过样本或不溢出缓冲区的情况下,找到最高的采样率。
    • 可以通过 --sampling-interval 参数手动配置。
    • 在报告中作为指标 smsp_pcsamp_interval_cycles 捕获。
  • 每个 SM 每 N 个周期

    1. 选择 SM 上的一个 Warp 调度器。
    2. 随机选择该 Warp 调度器上的一个活跃 Warp。
    3. 对于该 Warp 输出样本,包含:

      • 当前程序计数器。
      • 停顿原因:

        • 如果 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 调度器在该周期是否发出了指令的位信息。

SM 架构图
上图展示了一个 SM (GA10x) 的结构,其中包含 SMSP0 到 SMSP3 四个子处理器,每个子处理器又包含 12 个 Warp 槽位(W0-W11)。图例区分了“活跃 Warp”和“未使用的 Warp 槽位”。

Warp 停顿聚合:指标背景

样本计数

  • 核函数持续时间: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

Warp 停顿聚合:案例研究

在案例研究中,展示了具体指标值及其计算过程。

样本计数

  • 核函数持续时间 (smsp_cycles_active.max) = 657,043
  • SM 数量 (device_attribute_multiprocessor_count) = 46
  • 采样间隔 (smsp_pcsamp_interval_cycles) = 1,024
  • 样本数量 (smsp_pcsamp_sample_count) = 29,046
  • 估计的样本数量 (smsp_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

实时演示:Warp 停顿聚合与 L2 内存指标 (Live Demo: Warp Stalls Aggregates, and L2 Memory Metrics)

实时演示:Warp 停顿聚合与 L2 内存指标
实时演示:Warp 停顿聚合与 L2 内存指标

此幻灯片展示了NVIDIA Nsight Compute软件界面的实时演示,聚焦于“Warp 停顿聚合”和“L2 内存指标”。界面详细展示了与Warp停顿原因和L2内存访问相关的各种指标,例如Load/Store操作、访问延迟等。

源页面指标:总结

已执行指令指标
* 识别已执行的代码路径。
* 检测因不活跃线程和线程发散导致的效率低下。

Warp 停顿聚合
* 高样本计数是高延迟/高成本的指示器。
* 仅在 Issue Slot Utilization 不接近 100% 时才进行调查。
* 停顿样本通常聚合在依赖指令上,而非“慢速”指令本身。

内存指标
* 过多的扇区计数(全局/局部)和内存体冲突(共享)表明有改进潜力。
* 确认核函数是否受内存限制。
* 查阅详细信息页面以分析 L1TEX 和 L2 缓存的影响。
* 牢记“每执行指令的超额消耗”。
* 优先处理频繁执行且存在效率低下的指令。

Source Page 高级功能 (Source Page Advanced Features)

源页面高级功能
源页面高级功能

实时演示:函数级统计、相对指标模式和内联函数表

实时演示
实时演示

本幻灯片展示了一个实时演示,重点介绍了以下功能:
* 函数级统计 (Per-Function Statistics)
* 相对指标模式 (Relative Metric Modes)
* 内联函数表 (Inline Function Table)

演示界面左侧显示了代码视图,右侧则展示了汇编指令及其相关的性能指标,包括每指令执行次数(Instructions Executed)、占空比(Occupancy)等。界面中还可以看到详细的指令地址、源行、指令和操作数,以及全局(Global)和共享(Shared)内存访问信息,帮助用户深入分析代码性能。

Source Page 总结与展望

源页面总结与展望
源页面总结与展望

源页面总结

以下是源页面的主要总结要点:

  • 在编译阶段启用代码关联以获得所有优势:

    • 高级语言中的指标是从所有关联的 SASS 指令中聚合的。
    • 默认聚合函数是所有关联 SASS 指令的 sum()
    • Live Registers 的例外情况是使用 max() 函数。
  • 在关注高级语言的同时,对生成的汇编代码的基本理解会有所帮助:

    • ...了解应用或遗漏的优化。
    • ...深入了解高级指令的复杂性/成本。
    • ...设定正确的源指标预期。
      • 控制流的实现可以显著改变指标和性能。
      • 停顿(stalls)的影响通常首先出现在依赖指令上。
      • 利用寄存器依赖列。
  • 利用源页面的多种指标聚合和过滤功能:

    • 挑战主要在于识别大量数据中的问题。
    • 指标热图、内联函数分解、函数级统计、百分比形式的指标分解等等。
    • 从详情页面(Details Page)开始,进行有特定目标的源分析。
    • 指标组(Metric Groups)允许快速切换并专注于不同的指标集。

NVIDIA Nsight Compute:源页面的未来功能亮点

NVIDIA Nsight Compute:源页面的未来功能亮点
NVIDIA Nsight Compute:源页面的未来功能亮点

NVIDIA Nsight Compute 将在源页面中引入以下未来功能亮点:

  • 每源行引导式分析 (Guided Analysis per Source Line)

    • 突出显示检测到性能问题的行。
    • 快速导航到有问题的源行。
    • 关联表 (Correlation table)
      • 提供更多详细信息。
      • 支持排序和过滤。
  • 初步检测到的问题 (Initially Detected Issues)

    • 全局/本地内存访问与扇区过多(excessive sectors)。
    • 共享内存访问与银行冲突(bank conflicts)。
    • 具有停顿分析的高采样计数。
  • 通过现有规则系统完全可定制 (Fully Customizable through existing Rules System)

右侧的截图展示了 Nsight Compute 界面如何通过在代码行旁边的黄色感叹号标记来突出显示检测到的性能问题,并提供关于这些问题的描述和相关建议。

GTC'23 上的开发者工具

  • 开发者工具在最新版本的 CUDA Toolkit 中是免费提供的:

  • 支持通过以下途径获得:

  • 更多信息:

  • 会议 (Sessions)

    • SS1205: 从宏观到微观 - CUDA 开发者工具查找和修复任何规模的问题。
    • SS1421: 规模优化:调查和解决多节点工作负载中的隐藏瓶颈。
    • SS1882: 在使用 Nsight Compute 的源页面编写高性能 CUDA 内核时变得更快。
    • SS1772: 调试 CUDA:CUDA 正确性工具概述。
    • SS1230: 使用 Nsight 开发者工具进行 Orin 性能主体构建。
    • SE52434: Jetson Edge AI 开发者日:使用 NVIDIA Nsight 开发者工具充分利用 Jetson Orin。
  • 实验 (Labs)

    • DLIT51143: 使用 Nsight 性能分析工具高效地掌握常见优化模式。
    • DLIT51202: 调试和分析 CUDA 应用程序的正确性。
    • DLIT51580: 光线追踪开发使用 NVIDIA Nsight Graphics 和 NVIDIA Nsight Systems。
  • 与专家联系 (Connect with Experts)

    • CWESS2036: CUDA 工具箱中的 CUDA 性能分析、优化和调试工具最新架构是什么?
    • CWESS2009: 使用 NVIDIA 开发者工具优化光线追踪。
GTC'23 开发者工具
GTC'23 开发者工具