针对 NVIDIA Ada GPU 架构调优 CUDA 应用程序

本编程指南旨在针对基于 NVIDIA Ada GPU 架构的 GPU 调优 CUDA 应用程序。

1. NVIDIA Ada GPU 架构调优指南

1.1. NVIDIA Ada GPU 架构

NVIDIA® Ada GPU 架构是 NVIDIA 最新的 CUDA® 计算应用程序架构。NVIDIA Ada GPU 架构保留并扩展了之前 NVIDIA GPU 架构(如 NVIDIA Ampere 和 Turing)提供的相同 CUDA 编程模型,遵循这些架构最佳实践的应用程序通常可以在 NVIDIA Ada 架构上看到速度提升,而无需进行任何代码更改。本指南总结了应用程序可以进行微调以利用 NVIDIA Ada GPU 架构的特性获得额外速度提升的方法。1

有关本指南中讨论的编程特性的更多详细信息,请参阅 CUDA C++ 编程指南

1.2. CUDA 最佳实践

CUDA C++ 编程指南CUDA C++ 最佳实践指南 中描述的性能指南和最佳实践适用于所有支持 CUDA 的 GPU 架构。程序员必须主要关注遵循这些建议,以实现最佳性能。

这些指南中的高优先级建议如下:

  • 寻找并行化顺序代码的方法。

  • 最大限度地减少主机和设备之间的数据传输。

  • 调整内核启动配置以最大限度地提高设备利用率。

  • 确保全局内存访问合并。

  • 尽可能减少对全局内存的冗余访问。

  • 避免同一 Warp 中线程执行的长时间发散序列。

1.3. 应用程序兼容性

在解决本指南中涵盖的特定性能调优问题之前,请参阅 NVIDIA Ada GPU 架构 CUDA 应用程序兼容性指南,以确保您的应用程序以与 NVIDIA Ada GPU 架构兼容的方式编译。

1.4. NVIDIA Ada GPU 架构调优

1.4.1. 流式多处理器

与 Turing 和 NVIDIA Ampere GPU 架构相比,NVIDIA Ada GPU 架构的流式多处理器 (SM) 提供了以下改进。

1.4.1.1. 占用率

每个 SM 的最大并发 Warp 数量为 48,与计算能力 8.6 的 GPU 相比保持不变,其他 影响 Warp 占用率的因素 包括:

  • 寄存器文件大小为每个 SM 64K 32 位寄存器。

  • 每个线程的最大寄存器数量为 255。

  • 每个 SM 的最大线程块数量为 24。

  • 每个 SM 的共享内存容量为 100 KB。

  • 每个线程块的最大共享内存为 99 KB。

总体而言,开发人员可以期望在计算能力 8.6 的 GPU 上获得类似的占用率,而无需更改其应用程序。

1.4.1.2. 改进的张量核心运算

NVIDIA Ada GPU 架构包括新的 Ada 第四代张量核心,其特点是 Hopper FP8 Transformer Engine。

1.4.1.3. 改进的 FP32 吞吐量

计算能力为 8.9 的设备每个 SM 每个周期具有比计算能力为 8.0 的设备多 2 倍的 FP32 运算。虽然为 8.0 编译的二进制文件可以在 8.9 上按原样运行,但建议显式为 8.9 编译,以从增加的 FP32 吞吐量中获益。

1.4.2. 内存系统

1.4.2.1. 增加的 L2 缓存容量

NVIDIA Ada GPU 架构将 AD102 中的 L2 缓存容量增加到 98304 KB,比 GA102 大 16 倍。NVIDIA Ada GPU 架构允许 CUDA 用户控制 L2 缓存中数据的持久性。有关 L2 缓存中数据持久性的更多信息,请参阅 CUDA C++ 编程指南 中关于管理 L2 缓存的部分。

1.4.2.2. 统一共享内存/L1/纹理缓存

NVIDIA Ada 架构具有统一的 L1 缓存、纹理缓存和共享内存,类似于 NVIDIA Ampere 架构。组合的 L1 缓存容量为 128 KB。

在 NVIDIA Ada GPU 架构中,专用于共享内存的 L1 缓存部分(称为划分)可以在运行时选择,就像之前的架构(如 NVIDIA Ampere)一样,使用 cudaFuncSetAttribute() 和属性 cudaFuncAttributePreferredSharedMemoryCarveout。NVIDIA Ada GPU 架构支持每个 SM 0、8、16、32、64 或 100 KB 的共享内存容量。

CUDA 为每个线程块保留 1 KB 的共享内存。因此,计算能力为 8.9 的 GPU 可以在单个线程块中寻址高达 99 KB 的共享内存。为了保持架构兼容性,静态共享内存分配仍然限制为 48 KB,并且还需要显式选择加入才能启用高于此限制的动态分配。有关详细信息,请参阅 CUDA C++ 编程指南

与 NVIDIA Ampere 和 NVIDIA Volta GPU 架构一样,NVIDIA Ada GPU 架构将 L1 和纹理缓存的功能组合到一个统一的 L1/纹理缓存中,该缓存充当内存访问的合并缓冲区,在将数据传递到 Warp 之前收集 Warp 线程请求的数据。与之前的架构类似,它与共享内存结合的另一个好处是在延迟和带宽方面都有所改进。

2. 修订历史

版本 1.0

  • 首次公开发布

  • 添加了对计算能力 8.9 的支持

1

在本指南中,Volta 指的是计算能力为 7.0 的设备,Turing 指的是计算能力为 7.5 的设备,NVIDIA Ampere GPU 架构 指的是计算能力为 8.0 和 8.6 的设备,NVIDIA Ada 指的是计算能力为 8.9 的设备。

3. 声明

3.1. 声明

本文档仅供参考,不应被视为对产品的特定功能、状况或质量的保证。NVIDIA Corporation(“NVIDIA”)对本文档中包含信息的准确性或完整性不做任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对因使用此类信息或因其使用而可能导致的侵犯第三方专利或其他权利的后果或使用不承担任何责任。本文档不构成对开发、发布或交付任何材料(下文定义)、代码或功能的承诺。

NVIDIA 保留随时对此文档进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。

客户应在下订单前获取最新的相关信息,并应核实此类信息是最新且完整的。

NVIDIA 产品根据订单确认时提供的 NVIDIA 标准销售条款和条件进行销售,除非 NVIDIA 和客户的授权代表签署的单独销售协议(“销售条款”)另有约定。NVIDIA 特此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档不直接或间接地形成任何合同义务。

NVIDIA 产品并非设计、授权或保证适用于医疗、军事、飞机、航天或生命维持设备,也不适用于 NVIDIA 产品的故障或失灵可能合理预期会导致人身伤害、死亡或财产或环境损害的应用。NVIDIA 对在任何此类设备或应用中包含和/或使用 NVIDIA 产品不承担任何责任,因此,此类包含和/或使用由客户自行承担风险。

NVIDIA 不保证或声明基于本文档的产品将适用于任何特定用途。NVIDIA 不一定会执行每个产品所有参数的测试。客户全权负责评估和确定本文档中包含的任何信息的适用性,确保产品适合客户计划的应用并满足其要求,并为应用执行必要的测试,以避免应用或产品的默认设置。客户产品设计中的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的附加或不同条件和/或要求。NVIDIA 对任何可能基于或归因于以下原因的默认设置、损坏、成本或问题不承担任何责任:(i) 以任何违反本文档的方式使用 NVIDIA 产品;或 (ii) 客户产品设计。

在本文档下未授予任何 NVIDIA 专利权、版权或其他 NVIDIA 知识产权的明示或暗示许可。NVIDIA 发布的有关第三方产品或服务的信息不构成 NVIDIA 授予使用此类产品或服务的许可,也不构成对其的保证或认可。使用此类信息可能需要获得第三方的专利或其他知识产权或 NVIDIA 的专利或其他知识产权的许可。

只有在事先获得 NVIDIA 书面批准的情况下,才允许复制本文档中的信息,并且复制必须在不进行更改且完全符合所有适用的出口法律和法规的情况下进行,并附带所有相关的条件、限制和声明。

本文档以及所有 NVIDIA 设计规范、参考板、文件、图纸、诊断程序、列表和其他文档(统称为“材料”)均按“原样”提供。NVIDIA 不对材料做出任何明示、暗示、法定或其他方面的保证,并且明确否认所有关于非侵权、适销性和特定用途适用性的暗示保证。在法律未禁止的范围内,在任何情况下,NVIDIA 均不对因使用本文档而引起的任何损害(包括但不限于任何直接、间接、特殊、偶然、惩罚性或后果性损害,无论何种原因造成,也无论何种责任理论)承担责任,即使 NVIDIA 已被告知可能发生此类损害。尽管客户可能因任何原因遭受任何损害,但 NVIDIA 对本文所述产品的客户的累计责任应根据产品的销售条款进行限制。

3.2. OpenCL

OpenCL 是 Apple Inc. 的商标,已获得 Khronos Group Inc. 的许可使用。

3.3. 商标

NVIDIA 和 NVIDIA 徽标是 NVIDIA Corporation 在美国和其他国家/地区的商标或注册商标。其他公司和产品名称可能是与其相关的各自公司的商标。