GTC 大会火热进行中!别错过 NVIDIA CEO 黄仁勋的最新发布,以及 AI 和加速计算的必听会议。
模拟/建模/设计

CUDA 工具包 12.0 正式发布

NVIDIA 宣布最新的 CUDA 工具包软件版本 12.0 。该版本是多年来的第一个主要版本,它专注于通过新的硬件功能实现新的编程模型和 CUDA 应用程序加速。

现在,您可以使用 CUDA 自定义代码、增强的库和开发人员工具,针对 NVIDIA Hopper 和 NVIDIA Ada Lovelace 架构中特定于架构的功能和指令。

CUDA 12.0 包括许多主要和次要的变化。这里并没有列出所有更改,但本文概述了关键功能。

概述

  • 支持新的 NVIDIA Hopper 和 NVIDIA Ada Lovelace 架构功能,并为所有 GPU 提供了额外的编程模型增强,包括新的 PTX 指令和通过更高级别的 C 和 C ++ API 进行的曝光
  • 支持改进后的 CUDA 动态并行 API ,与传统 API 相比,性能有了显著提高
  • CUDA 图形 API 的增强功能:
    • 现在,您可以通过调用内置函数来调度 GPU 设备端内核的图形启动。有了这种能力,内核中的用户代码可以动态调度图形启动,大大提高了 CUDA 图形的灵活性。
    • cudaGraphInstantiate API 已被重构以删除未使用的参数。
  • 支持 GCC 12 主机编译器
  • 支持 C ++ 20
  • JIT LTO CUDA 工具包中的新nvJitLink
  • 库优化和性能改进
  • Nsight Compute 和 Nsight Systems 开发人员工具更新
  • 更新了对最新 Linux 版本的支持

有关详细信息,请参见 CUDA Toolkit 12.0 Release NotesCUDA Toolkit 12.0 可供下载。

NVIDIA Hopper 和 NVIDIA Ada Lovelace 架构支持

CUDA 应用程序可以立即受益于新 GPU 系列中增加的流式多处理器( SM )计数、更高的内存带宽和更高的时钟速率。 CUDA 和 CUDA 库基于 GPU 硬件架构增强提供了新的性能优化。

CUDA 12.0 为 NVIDIA Hopper 和 NVIDIA Ada Lovelace 架构的许多功能提供了可编程功能:

  • 许多张量运算现在可以通过公共 PTX 获得:
    • TMA 操作
    • TMA 批量操作
    • 32x Ultra xMMA (包括 FP8 和 FP16 )
  • NVIDIA Hopper GPU 中的启动参数控制membar
  • 支持 C ++和 PTX 中的 Hopper 异步事务屏障
  • 支持协同网格阵列( CGA )放松障碍的 C intrinsic
  • 支持编程二级缓存到 SM 多播(仅限 NVIDIA Hopper GPU )
  • 支持 SIMT 集体的公共 PTX :elect_one
  • 基因组学和 DPX 指令现在可用于 NVIDIA Hopper GPU ,以提供更快的组合数学运算(三向最大值、融合加法+最大值等)。

延迟加载

延迟加载是一种延迟内核和 CPU 侧模块加载的技术,直到应用程序需要加载。默认值是在库首次初始化时抢先加载所有模块。这不仅可以节省设备和主机内存,还可以节省算法的端到端执行时间。

自 11.7 发布以来,延迟加载一直是 CUDA 的一部分。后续的 CUDA 版本继续对其进行扩充和扩展。从应用程序开发的角度来看,选择延迟加载不需要任何特定的东西。您的现有应用程序按原样使用延迟加载。

如果您的操作对延迟特别敏感,您可能需要评测应用程序。与延迟加载的权衡是在应用程序中首次加载函数时的最小延迟量。这总体上低于没有延迟加载的总延迟。​

Metric Baseline CUDA 11.7 CUDA 11.8+ Improvement
End-to-end runtime [s] 2.9 1.7 0.7 4x
Binary load time [s] 1.6 0.8 0.01 118x
Device memory footprint [MB] 1245 435 435 3x
Host memory footprint [MB] 1866 1229 60 31x
表 1 。延迟加载的应用程序加速示例

所有用于延迟加载的库都必须使用 11.7 +才能符合条件。

在此版本中,默认情况下, CUDA 堆栈中未启用延迟加载。要为应用程序评估它,请使用设置的环境变量CUDA_MODULE_LOADING=LAZY运行。

兼容性

CUDA 次要版本兼容性是 11.x 中引入的一项功能,它使您能够灵活地将应用程序与同一主要版本中的 CUDA Toolkit 的任何次要版本动态链接。编译一次代码,您就可以动态链接到 CUDA Toolkit 同一主要版本中任何次要版本的库、 CUDA runtime 和用户模式驱动程序。

例如, 11.6 个应用程序可以链接到 11.8 运行时,反之亦然。这是通过库文件中的 API 或 ABI 一致性实现的。有关详细信息,请参见 CUDA Compatibility

次要版本兼容性持续到 CUDA 12.x 。但是,由于 12.0 是一个新的主要版本,兼容性保证被重置。在 11.x 中使用次要版本兼容性的应用程序在链接到 12.0 时可能会出现问题。要么根据 12.0 重新编译应用程序,要么静态链接到 11.x 中所需的库,以确保开发的连续性。

同样,在 12.0 中重新编译或构建的应用程序将链接到未来版本的 12.x ,但不会链接到 CUDA Toolkit11.x 的组件。

JIT LTO 支持

CUDA 12.0Toolkit 为 JIT LTO 支持引入了新的nvJitLink库。 NVIDIA 不支持此功能的驱动程序版本。有关详细信息,请参见 Deprecated Features

C ++ 20 编译器支持

CUDA Toolkit12.0 增加了对 C ++ 20 标准的支持。以下主机编译器及其最低版本启用了 C ++ 20 :

  • 通用计算机 10
  • 宗族 11
  • MSVC 2022 年
  • NVC ++ 22.x 版本
  • 臂 C / C ++ 22.x

有关功能的更多信息,请参阅相应的主机编译器文档。

虽然大多数 C ++ 20 功能在主机和设备代码中都可用,但有些功能受到限制。

模块支持

C ++ 20 中引入了模块,作为跨翻译单元导入和导出实体的新方法。

由于 CUDA 设备编译器和主机编译器之间需要复杂的交互,因此 CUDA C ++在主机或设备代码中都不支持模块。模块的使用以及导出和导入关键字被诊断为错误。

配套支架

子程序是可恢复的函数。可以暂停执行,在这种情况下,控制权返回给调用者。协程的后续调用在其被挂起时恢复。

主机代码支持子程序,但设备代码不支持。设备功能范围内co_awaitco_yieldco_return关键字的使用在设备编译期间被诊断为错误。

三向比较运算符

三元比较运算符<=>是一种新的关系运算符,使编译器能够综合其他关系运算符。

因为它与标准模板库中的实用程序函数紧密耦合,所以每当隐式调用宿主函数时,它的使用在设备代码中受到限制。

在直接调用运算符且不需要启用隐式调用的情况下使用。

Nsight 开发人员工具

Nsight 开发人员工具正在接收与 CUDA 工具包 12.0 一致的更新。

NVIDIA Nsight Systems 2022.5 介绍了 InfiniBand 交换机度量采样的预览。 NVIDIA Quantum InfiniBand 交换机提供高带宽、低延迟通信。在 Nsight Systems 时间线上查看交换机指标,使您能够更好地了解应用程序的网络使用情况。您可以使用此信息优化应用程序的性能。

Screenshot of InfiniBand Switch network usage visualized in the Nsight Systems timeline. Throughput can be expanded to view bytes received and bytes sent.
图 1 。 Nsight 系统中的 InfiniBand Switch 指标

Nsight 工具旨在协作使用。 Nsight 系统中的性能分析通常为深入了解 Nsight Compute 中的内核活动提供信息。

为了简化这一过程, Nsight Compute 2022.4 引入了 Nsight Systems 集成。此功能使您能够启动系统跟踪活动并在 Nsight Compute 界面中查看报告。然后,您可以检查报告并从上下文菜单中启动内核评测。

使用此工作流,您不必运行两个不同的应用程序:所有这些都可以在一个应用程序中完成。

Screenshot of a system trace being viewed in Nsight Compute. Right-clicking on the selected kernel opens the context menu, and kernel profiling can be launched.
图 2 : Nsight 计算中的 Nsight 系统集成

Nsight Compute 2022.4 还引入了一个新的内联函数表,它为函数的多个内联实例提供了性能度量。这个被大量请求的特性使您能够了解函数是在一般情况下还是仅在特定的内联情况下遇到性能问题。

它还使您能够了解内联发生的位置,当这种级别的详细信息不可用时,这通常会导致混乱。主源代码视图继续显示每行级别的度量汇总,而表中列出了函数内联的多个位置以及每个位置的性能度量。

Screenshot of the source code viewer showing per-line metrics alongside a breakdown of where the function was inlined and its performance in those cases.
图 3 。 Nsight Compute 中的内联函数表

Acceleration Structure 查看器还获得了各种优化和改进,包括对 NVIDIA OptiX 曲线分析的支持。

有关详细信息,请参见 NVIDIA Nsight ComputeNVIDIA Nsight SystemsNsight Visual Studio Code Edition

数学库更新

添加到库中的所有优化和功能都是有代价的,通常以二进制大小的形式出现。每个库的二进制大小在其生命周期中缓慢增加。 NVIDIA 已在不牺牲性能的情况下,努力缩小这些二进制文件。 cuFFT 的尺寸减小最大, CUDA 工具包 11.8 和 12.0 之间的尺寸减小超过 50% 。

还有一些特定于库的特性值得一提。

库布拉斯

cuBLASLt 使用新的 FP8 data types 公开了混合精度乘法运算。这些操作还支持 BF16 和 FP16 偏置融合,以及 FP8 输入和输出数据类型的 GEMs 的 FP16 偏置与 GELU 激活融合。

在性能方面,与 A100 上的 BF16 相比, H100 PCIe 和 SXM 上的 FP8 GEMM 分别快 3 倍和 4.5 倍。 CUDA Math API 提供 FP8 转换,以便于使用新的 FP8 矩阵乘法运算。

cuBLAS 12.0 扩展了 API 以支持 64 位整数问题大小、前导维数和向量增量。这些新函数与 32 位整数对应函数具有相同的 API ,不同之处在于它们的名称中带有_64后缀,并将相应的参数声明为int64_t

cublasStatus_t cublasIsamax(cublasHandle_t handle, int n, const float *x, int incx, int *result);

64 位整数对应项如下:

cublasStatus_t cublasIsamax_64(cublasHandle_t handle, int64_t n, const float *x, int64_t incx, int64_t *result);

性能是 cuBLAS 的重点。当传递给 64 位整数 API 的参数符合 32 位范围时,库将使用与调用 32 位整数 API 相同的内核。要尝试新的 API ,迁移应该像在 cuBLAS 函数中添加_64后缀一样简单,这要归功于 C / C ++将int32_t值自动转换为int64_t

快速傅里叶变换

在计划初始化期间, cuFFT 执行一系列步骤,包括试探法,以确定使用了哪些内核以及内核模块加载。

从 CUDA 12.0 开始, cuFFT 使用 CUDA 并行线程执行( PTX )汇编形式(而不是二进制形式)提供了更多的内核。

当 cuFFT 计划初始化时, CUDA 设备驱动程序在运行时加载 cuFFT 内核的 PTX 代码并进一步编译为二进制代码。由于新的实现,第一个可用的改进将为 NVIDIA Maxwell 、 NVIDIA Pascal 、 NVIDIA Volta 和 NVIDIA Turing 架构启用许多新的加速内核。

cuSPARSE 公司

为了减少稀疏稀疏矩阵乘法( SpGEMM )所需的工作空间, NVIDIA 发布了两种内存使用率更低的新算法。第一种算法计算中间产品数量的严格界限,而第二种算法允许将计算划分为块。这些新算法对内存存储量较小的设备上的客户非常有用。

INT8 支持已添加到cusparseGathercusparseScattercusparseCsr2cscEx2中。

最后,对于 SpSV 和 SpSM ,预处理时间平均提高了 2.5 倍。对于执行阶段, SpSV 平均提高了 1.1 倍,而 SpSM 平均提高了 3.0 倍。

数学 API

新的 NVIDIA Hopper 架构配备了新的 Genomics 和 DPX 指令,用于更快地计算组合算术运算,如三向最大值、融合加法+最大值等。

新的 DPX 指令使动态编程算法比 A100 GPU 的速度提高了 7 倍。动态编程是一种通过将复杂递归问题分解为更简单的子问题来解决复杂递归问题的算法技术。为了获得更好的用户体验,现在通过 MathAPI 公开了这些说明。

例如,三路 max + ReLU 操作max(max(max(a, b), c), 0)

int __vimax3_s32_relu ( const int  a, const int  b, const int  c )

有关详细信息,请参见 Boosting Dynamic Programming Performance Using NVIDIA Hopper GPU DPX Instructions

图像处理更新: nvJPEG

nvJPEG 现在有一个改进的实现,显著减少了 GPU 内存占用。这是通过使用零拷贝内存操作、融合内核和就地颜色空间转换来实现的。

总结

我们继续致力于帮助研究人员、科学家和开发人员通过简化的编程模型解决世界上最复杂的 AI / ML 和数据科学挑战。

该 CUDA 12.0 版本是多年来的第一个主要版本,是通过使用下一代 NVIDIA GPU 帮助加速应用程序的基础。 NVIDIA Hopper 和 NVIDIA Ada Lovelace 体系结构中特定于体系结构的新功能和指令现在可通过 CUDA 自定义代码、增强的库和开发人员工具进行定位。

使用 CUDA 工具包,您可以在 GPU 加速的嵌入式系统、桌面工作站、企业数据中心、基于云的平台和 HPC 超级计算机上开发、优化和部署应用程序。该工具包包括 GPU 加速库、调试和优化工具、 C / C ++编译器、运行库以及对许多高级 C / C ++和 Python 库的访问。

有关更多信息,请参阅以下资源:

 

Tags