Hopper架构和CUDA版本的兼容性

前言

这份应用指南,CUDA 应用的 Hopper 架构兼容性指南,旨在帮助开发者确保他们的 NVIDIA® CUDA® 应用能够在基于 NVIDIA® Hopper 架构的 GPU 上运行。本文档为那些熟悉使用 CUDA C++ 进行编程并希望确保其软件应用与 Hopper 架构兼容的开发者提供了指导。

兼容性

A CUDA application binary (with one or more GPU kernels) can contain the compiled GPU code in two forms, binary cubin objects and forward-compatible PTX assembly for each kernel. Both cubin and PTX are generated for a certain target compute capability. A cubin generated for a certain compute capability is supported to run on any GPU with the same major revision and same or higher minor revision of compute capability. For example, a cubin generated for compute capability 8.0 is supported to run on a GPU with compute capability 8.6, however a cubin generated for compute capability 8.6 is not supported to run on a GPU with compute capability 8.0, and a cubin generated with compute capability 8.x is not supported to run on a GPU with compute capability 9.0.

Kernel can also be compiled to a PTX form. At the application load time, PTX is compiled to cubin and the cubin is used for kernel execution. Unlike cubin, PTX is forward-compatible. Meaning PTX is supported to run on any GPU with compute capability higher than the compute capability assumed for generation of that PTX. For example, PTX code generated for compute capability 8.x is supported to run on compute capability 8.x or any higher revision (major or minor), including compute capability 9.0. Therefore although it is optional, it is recommended that all applications should include PTX of the kernels to ensure forward-compatibility. To read more about cubin and PTX compatibilities see Compilation with NVCC from the CUDA C++ Programming Guide.

When a CUDA application launches a kernel on a GPU, the CUDA Runtime determines the compute capability of the GPU in the system and uses this information to find the best matching cubin or PTX version of the kernel. If a cubin compatible with that GPU is present in the binary, the cubin is used as-is for execution. Otherwise, the CUDA Runtime first generates compatible cubin by JIT-compiling 1 the PTX and then the cubin is used for the execution. If neither compatible cubin nor PTX is available, kernel launch results in a failure.

Application binaries that include PTX version of kernels, should work as-is on the Hopper GPUs. In such cases, rebuilding the application is not required. However application binaries which do not include PTX (only include cubins), need to be rebuilt to run on the Hopper GPUs. To know more about building compatible applications read Building Applications with Hopper Architecture Support

CUDA应用程序二进制文件(包含一个或多个GPU内核)可以以两种形式包含编译后的GPU代码,即二进制cubin对象和每个内核的向前兼容PTX汇编。cubin和PTX都是为特定目标计算能力生成的。对于某个计算能力生成的cubin,支持在具有相同主要修订版本和相同或更高次要修订版本的任何GPU上运行。例如,为计算能力8.0生成的cubin可以在具有计算能力8.6的GPU上运行,但是为计算能力8.6生成的cubin不能在具有计算能力8.0 的 GPU 上运行,并且使用 计算能力8.x 生成的cubin不支持在具有计算 能力9.0的GPU上运行。

内核也可以编译成 PTX 形式。在应用程序加载时,将 PTX 编译成 cubin,并使用该 cubin 进行内核执行。与 cubin 不同,PTX 是向前兼容的。这意味着 PTX 可以在高于为其生成 PTX 所假设的计算能力的任何 GPU 上运行。例如,针对计算能力 8.x 生成的 PTX 代码可以在计算能力 8.x 或更高的修订版本(主要或次要)上运行,包括计算能力 9.0。因此,虽然这是可选的,但建议所有应用程序都应包含内核的 PTX 以确保向前兼容性。有关 cubin 和 PTX 兼容性的更多信息,请参阅 CUDA C++ 编程指南中的使用 NVCC 进行编译。

当 CUDA 应用程序在 GPU 上启动内核时,CUDA Runtime 会确定系统中 GPU 的计算能力,并使用此信息查找最佳匹配的 cubin 或 PTX 版本的内核。如果二进制文件中存在与该 GPU 兼容的 cubin,则直接使用该 cubin 进行执行。否则,CUDA Runtime 首先通过 JIT 编译 PTX 生成兼容的 cubin,然后再使用该 cubin 进行执行。如果既没有可用于兼容性检查的 cubin,也没有 PTX,则内核启动将失败。

包含内核 PTX 版本的应用程序二进制文件可以在 Hopper GPU 上直接使用。在这种情况下,不需要重新构建应用程序。但是只包含 cubins 而不包括 PTX(即仅具有 cubins)的应用程序二进制文件需要重新构建才能在 Hopper GPU 上运行。有关构建兼容应用程序的更多信息,请阅读具有 Hopper 架构支持的应用程序构建指南。

总结

具体细节可以看教程,这里直接放出chatgpt总结的内容:

如果你想使用Hopper架构,你需要使用CUDA Toolkit来编译你的CUDA代码。具体的编译方法取决于你使用的CUDA Toolkit的版本。

  1. 使用CUDA Toolkit 11.7或更早版本:你可以使用nvcc编译器生成适用于NVIDIA Ampere GPU架构(计算能力8.x)的本地cubin文件。你需要在nvcc命令行上指定适当的-gencode=参数,如下例所示:

    /usr/local/cuda/bin/nvcc \
    -gencode=arch=compute_52,code=sm_52 \
    -gencode=arch=compute_60,code=sm_60 \
    -gencode=arch=compute_61,code=sm_61 \
    -gencode=arch=compute_70,code=sm_70 \
    -gencode=arch=compute_75,code=sm_75 \
    -gencode=arch=compute_80,code=sm_80 \
    -gencode=arch=compute_80,code=compute_80 \
    -O2 -o mykernel.o -c mykernel.cu
    
  2. 使用CUDA Toolkit 11.8:使用CUDA Toolkit 11.8的nvcc可以生成适用于Hopper架构(计算能力9.0)的本地cubin。你需要在nvcc命令行上指定适当的-gencode=参数,如下例所示:

    /usr/local/cuda/bin/nvcc \
    -gencode=arch=compute_52,code=sm_52 \
    -gencode=arch=compute_60,code=sm_60 \
    -gencode=arch=compute_61,code=sm_61 \
    -gencode=arch=compute_70,code=sm_70 \
    -gencode=arch=compute_75,code=sm_75 \
    -gencode=arch=compute_80,code=sm_80 \
    -gencode=arch=compute_90,code=sm_90 \
    -gencode=arch=compute_90,code=compute_90 \
    -O2 -o mykernel.o -c mykernel.cu
    

在这两个例子中,-gencode=arch=compute_XX,code=sm_XX-gencode=arch=compute_XX,code=compute_XX指定了为哪些GPU架构生成代码。compute_XX指的是PTX版本,sm_XX指的是cubin版本。arch=子句指定了前端编译目标,必须始终是PTX版本。code=子句指定了后端编译目标,可以是cubin或PTX或两者都有。只有code=子句指定的后端目标版本会保留在最终的二进制文件中;至少应该有一个PTX版本以确保与未来的架构兼容。

参考

4090计算能力8.9
H100 9.0
L4 8.9
L40 8.9