硬件向前兼容性#

cuDNN 硬件向前兼容性 指的是给定 cuDNN 版本与未来硬件的兼容性。

如果一个 cuDNN 构建版本在未来的硬件上能够正常工作,那么它就是硬件向前兼容的。这允许链接到 cuDNN 的应用程序在未来的硬件上继续工作,而无需更新到更新的 cuDNN 版本。但是,存在一些注意事项。

  • 此功能在 cuDNN 9.0.0 中添加,并且仅适用于使用 CUDA 工具包 12 或更高版本的构建版本。早期版本的 cuDNN 不具备硬件向前兼容性。

  • cuDNN 的硬件向前兼容性存在一些限制。这些限制将在本节后面进行说明。

  • CUDNN_LIB_CONFIG 设置需要设置为 FULL 才能实现向前兼容性。

在本节中,除非另有明确说明,否则向前兼容性兼容性的使用均指硬件向前兼容性。

每个版本,cuDNN 库都有一个它原生支持的 SM 版本列表,该列表在 cuDNN 支持矩阵 中列出。当在这些 SM 版本之一上运行时,库处于原生模式。原生支持是指库包含专门为该 SM 架构编译的显式 CUDA 内核。

另一方面,当在比原生支持的设备更新的设备上运行时,库处于向前兼容性模式,其中将使用 CUDA 内核的 PTX JIT 编译来支持库工作负载。

注意

每个版本的 cuDNN 库都存储了它原生支持的 GPU 的最高 SM 编号;这通常是 cuDNN 版本发布时最新的 NVIDIA GPU 的 SM 编号。可以通过调用函数 cudnnGetMaxDeviceVersion() 查询此值。对于任何 SM 编号高于此编号的 GPU,将以向前兼容性模式支持该 SM。

配置向前兼容性模式#

默认情况下,当库检测到它正在新的 GPU 上运行时(该 GPU 它不原生支持),向前兼容性模式会自动启用。如果不需要这样做,请导出 ENV 变量 CUDNN_FORWARD_COMPAT_DISABLE=1 以禁用向前兼容性模式。

在这种情况下,库可能在它不原生支持的未来设备上失败

如果需要支持未来的硬件设备,我们建议

  • 将 cuDNN 库升级到原生支持该设备的版本(这将在新硬件上提供最佳可用支持);或者

  • 保持默认启用向前兼容性支持(即,CUDNN_FORWARD_COMPAT_DISABLE=0 或不导出),这意味着库将默认尝试通过在向前兼容性模式下运行来支持 NVIDIA GPU 的未来架构。

向前兼容性与 Graph API#

我们建议在您计划运行的设备上查询启发式方法,以获得在该查询设备上高性能且有望运行的引擎配置。具体来说,使用 CUDNN_HEUR_MODE_A 查询操作图推荐的引擎配置列表并在其中选择。目前没有其他模式针对向前兼容性进行调整。此建议意味着当从旧设备首次切换到新设备时,用户绝不应使用以前自动调整或以其他方式最终确定的引擎配置。

在向前兼容性模式下,CUDNN_HEUR_MODE_A 具有以下重要属性

  • 当在向前兼容性模式下调用启发式方法时,它不会返回不向前兼容的引擎配置。

  • 它专门针对向前兼容性模式进行了调整,因此可以提供性能更高的配置。

由于在向前兼容性模式下与在原生模式下查询启发式方法时,推荐的引擎配置可能不同,因此这两种模式之间可能无法比较推荐的引擎配置的数值属性和性能。用户应查询推荐引擎的行为注释,并筛选掉那些在向前兼容性模式下具有他们不期望的数值属性的引擎,这与他们在原生模式下的做法类似。

由于向前兼容性模式依赖于 PTX JIT(即时)编译,因此可能存在编译开销。与任何 CUDA 应用程序一样,这些开销可以通过延迟加载来管理(例如,请参阅 CUDA_MODULE_LOADING 环境变量)和缓存 JIT 编译的内核,有关 JIT 缓存的更多信息,请参阅此 CUDA 部分。

请注意,与原生模式一样,不支持反序列化在旧硬件上序列化的执行计划。执行计划必须在匹配的硬件上序列化和反序列化。

支持的图形模式#

虽然目标是使所有可以在 cuDNN 中成功最终确定的操作图都向前兼容,但这在今天还不是真的。以下是截至本版本向前兼容的图形操作集

上面未列出的操作图尚未实现向前兼容;但是,预计在后续版本中将实现向前兼容。目前一些值得注意的不支持的图形模式示例包括

对于尚不向前兼容的操作图,库将返回 status CUDNN_STATUS_NOT_SUPPORTED_ARCH_MISMATCH

对于通用运行时融合引擎中的以下情况,向前兼容性模式存在一些已知问题

  • 一些涉及以下模式的卷积融合

    • 卷积前向操作或数据梯度操作,后跟 g 2 的操作(在 通用运行时融合引擎 中),仅支持广播到完整张量,不支持向量或标量张量之间的广播。使用后者可能会产生不正确的结果。

    • 涉及 分组卷积 的融合模式,即 G>1 的卷积,不支持数据梯度和权重梯度操作。

    • 卷积前向操作,后跟 g 2 的操作(在 通用运行时融合引擎 中),涉及 CUDNN_BACKEND_OPERATION_REDUCTION_DESCRIPTOR,不支持以下归约模式

      • [N, K, P, Q] -> [N, 1, 1, 1]

      • [N, K, P, Q] -> [N, K, 1, 1]

  • g 1 中的融合模式(在 通用运行时融合引擎 中)结合 CUDNN_BACKEND_OPERATION_POINTWISE_DESCRIPTOR,其中涉及 CUDNN_POINTWISE_MUL (pointwise:Scale)CUDNN_POINTWISE_ADD (pointwise:Bias)CUDNN_POINTWISE_RELU_FWD (pointwise:Relu) 模式,仅支持 half I/O 数据类型和 float32 计算类型用于 convolutionForward / ConvolutionBackwardFilter,而 ConvolutionBackwardData 不支持任何数据类型。

  • 不支持具有混合精度输入张量的 Matmul 操作。

  • 主循环融合在任一输入分支上具有多个完整张量的 Matmul 融合不受支持。

  • 对于涉及浮点输入到数据梯度操作的融合模式,仅支持 NHWC 布局格式。