一、概念说明
对于很多从事GPU编程者来说,NVIDIA公司是无法绕开的概念。虽然国内和国外有着大量的竞争对手,但随着马斯克确定将未来的GPU集群使用的硬件绑定到NVIDIA的GPU,这是什么意义大家应该都明白了。所以对于广大的开发者来说,NVIDIA GPU的开发可以作为一种重要的开发路径,再遇到其它实际GPU后,也可以很好的进行相关的扩展。怎么说呢?至少到现在,大家的技术路线应该整体都差不多,不会有太革命的技术出现。否则NVIDIA也可以放弃了。
扯回来,在学习CUDA编程时,遇到了很多基础的技术细节问题。这些细节是一些环境指标的技术细节,与真正的技术关系并不大,但在安装各种环境和开发时又都需要。所以在经历了反复安装和实际操作应用的过程后,对其进行一些全面的整理,供大家借鉴。
总结以到目前为止,NVIDIA的GPU和CUDA的相关软硬件最新版本为止。
- GPU发展版本(硬件)
NVIDIA公司从推出GPU到现在,经历了很多的版本或者说代际的发展。大家熟悉的什么gtx960,rtx 5060等,这都是某个版本或代际的实际的产品型号。大家不要将二者混淆。根据NVIDIA公司的推出先后顺序,经历以下几个版本(时间线从前到后):
Fermi、Kepler、Maxwell、Pascal、Volta、Turing、Ampere、Ada、Hopper、Blackwell。它们代表着NVIDIA GPU的硬件架构不同版本或代际的命名。每一代架构会改变SM(Streaming Multiprocessor)、缓存、调度、Tensor Core、显存和互联等硬件能力
- Compute Capability(计算力)
Compute Capability,即CC,是CUDA软件体现的GPU指令集和硬件功能版本。有过CUDA编程经验的都知道,计算力是直接决定GPU运算能力大小的指标,也是运行支持相关CUDA版本的重要指标。一般表示如下:
- 8.0对应编译目标 sm_80
- 8.6对应编译目标 sm_86
- 9.0对应编译目标 sm_90
- 12.0对应编译目标 sm_120
这个在前面的CUDA编程中,修改VS中的版本计算力时应用到过
CC决定CUDA中可以使用哪些设备指令、数据类型和执行模型,但无法代表性能。例如A100 是sm_80,RTX 3090是 sm_86,但A100的FP64、HBM、NVLink、MIG 等数据中心能力更强。
- CUDA Toolkit
CUDA为了适合上面不同版本的硬件和计算力,提供了相应的不同的版本,如前面经常看到的CUDA 11.8、12.8、13.3。CUDA不是一个软件,而是一个软件包或者更准确的说是一个包含NVCC、CUDA Runtime、cuBLAS、cuFFT、调试和分析工具等的工具链。
Compute Capability和CUDA Toolkit是两回事。GPU能否使用某个Toolkit,主要由下面确定:
- Toolkit是否支持该CC生成代码
- CUDA库是否支持该架构的实现
- NVIDIA驱动是否支持相关Toolkit和GPU
- Python/C++框架是否在其二进制包中包含该架构(版本匹配)
目前CUDA Toolkit最新为:CUDA 13.3 Update 1,但官方提供了13.4.0的Preview。
二、NVIDIA GPU代际与能力演进
为了能够更好的查看不同硬件架构版本的GPU功能及相关的软件生态的支持,组织了下面的表:
| 代际 | 典型 CC | 代表产品 | 关键能力变化 | 原生 CUDA 支持范围 |
|---|---|---|---|---|
| Tesla | 1.x | 8800、Tesla C1060 | CUDA SIMT起点,功能和编程能力有限 | 早期CUDA,当前已淘汰 |
| Fermi | 2.0/2.1 | C2050、GTX 580 | L1/L2 Cache、ECC、并发 Kernel、较完整C++ | CUDA 3.0 至 8.0 |
| Kepler | 3.0/3.2/3.5/3.7 | K20、K40、K80 | Dynamic Parallelism、Hyper-Q、warp shuffle | 最晚CUDA 10.2或11.x |
| Maxwell | 5.0/5.2/5.3 | M40、GTX 980 | 显著提高能效、共享内存和原子操作性能 | CUDA 6.5 至 12.x |
| Pascal | 6.0/6.1/6.2 | P100、P40、GTX 1080、Jetson TX2 | HBM2、首代 NVLink、FP16、统一内存按需迁移 | CUDA 8.0至12.x |
| Volta | 7.0/7.2 | V100、Jetson Xavier | 第一代Tensor Core、独立线程调度、Cooperative Groups | CUDA 9.0至12.x |
| Turing | 7.5 | T4、RTX 20 | Tensor Core增加 INT8/INT4,RT Core,FP/INT 并发 | CUDA 10.0起,仍支持 |
| Ampere | 8.0/8.6/8.7 | A100、A30、RTX 30、Jetson Orin | TF32、BF16、稀疏 Tensor Core、异步拷贝、A100 MIG | CUDA 11.0 起 |
| Ada | 8.9 | L40S、RTX 40 | 第四代 Tensor Core、第三代RT Core,更强推理与能效 | CUDA 11.8 起 |
| Hopper | 9.0 | H100、H200、GH200 | FP8 Transformer Engine、TMA、DPX、Thread Block Cluster | CUDA 11.8 起 |
| Blackwell 数据中心 | 10.0/10.3 | B200、GB200、B300、GB300 | NVFP4、第五代Tensor Core、Tensor Memory、NVLink 5 | 10.0 从CUDA 12.8;建议 13.x |
| Blackwell Jetson | 11.0 | Jetson T4000/T5000 | 面向边缘AI的Blackwell分支 | 建议CUDA 13.x/对应 JetPack |
| Blackwell RTX | 12.0 | RTX 50、RTX PRO Blackwell | Blackwell图形、AI和神经渲染能力 | CUDA 12.8 起 |
| Blackwell GB10 | 12.1 | DGX Spark | Grace Blackwell桌面AI平台 | 建议CUDA 13.x |
官方文档已经明确指出:CUDA 13已不再支持Maxwell、Pascal、Volta的离线编译和CUDA相关的库。它们只能继续使用CUDA 12.x。
三、各代核心能力
1. Fermi至Pascal
通用并行计算基础的阶段,Fermi提供了现代CUDA GPU的缓存、ECC和并发Kernel基础;Kepler引入Dynamic Parallelism和Hyper-Q的共享GPU的能力。Maxwell侧重提高单元性能、共享内存效率和原子操作性能;Pascal开始把GPU从单卡加速器推向高带宽系统组件,并在P100引入HBM2和NVLink,改善统一内存的按需页面迁移
2. Volta
Tensor Core的引入,以FP16输入执行矩阵乘加并使用FP16/FP32累加。它还引入Independent Thread Scheduling,不应再假设一个warp内所有活动线程始终隐式锁步执行。如果旧CUDA程序依赖隐式warp同步,在Volta及之后架构上应使用__syncwarp()、Cooperative Groups和带同步掩码的warp intrinsic,防止出现错误
3. Turing
在消费级显卡中引入Tensor Core即Tensor Core和独立线程调度进入GeForce RTX系列。同时引入RT Core,使唤硬件支持实时光线追踪
4. Ampere
支持了AI训练和异步流水线,主要包括:TF32 Tensor Core、BF16、FP64 Tensor Core、 结构化稀疏加速、硬件异步拷贝等等。特别是A100的MIG,可以把一张GPU隔离成多个实例(类似于虚拟化)。
5. Hopper
支持Transformer和复杂数据搬运,包括:FP8 Transformer Engine、Tensor Memory Accelerator(TMA)、Thread Block Cluster、Distributed Shared Memory、DPX动态规划指令、更大的共享内存和更强的异步执行模型
6. Blackwell
Blackwell重点支持NVFP4/MXFP8、第五代Tensor Core、Tensor Memory、更强的Transformer推理能力和第五代NVLink。Blackwell不再对应单一的CC,而是包含10.0/10.3/11.0/12.0/12.1多个产品分支。CUDA还增加了family-specific编译目标:
- compute_100f可用于CC 10.0 和 10.3的共同功能;
- compute_120f可用于CC 12.0 和 12.1的共同功能;
- compute_100a等带a的目标是特定架构专用代码,不能假设跨代兼容。
四、CUDA Toolkit与驱动兼容性
- 大版本兼容范围
| Toolkit 系列 | Minor Version Compatibility 最低驱动 | 典型范围 |
|---|---|---|
| CUDA 11.x | R450 | 通常为 >=450,<525 |
| CUDA 12.x | R525 | 通常为 >=525,<580 |
| CUDA 13.x | R580 | 新驱动继续向后兼容 |
CUDA 13.3 Update 1 的完整配套 Linux 驱动版本为 >=610.43.02。在CUDA 13.x的最低兼容驱动R580上运行时,部分同时依赖Toolkit和新驱动的功能可能不可用。
大家可以参考前面安装rtx pro 4000时的相关分析说明,对照一下。
- 兼容规则
- 向后兼容:新驱动通常能运行由旧Toolkit构建的程序。但旧驱动不能保证运行由新Toolkit构建的程序
- nvidia-smi的 CUDA Version是当前驱动最大支持的CUDA版本,但不代表系统已安装该Toolkit
- 本地Toolkit版本建议使用nvcc --version查询
- Python框架实际编译使用的版本应根据实际情况查询
常用检查命令:
nvidia-smi --query-gpu=name,compute_cap,driver_version --format=csv
nvcc --version
import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.cuda.is_available())
print(torch.cuda.get_device_capability() if torch.cuda.is_available() else None)
- Cubin与PTX
CUDA可执行文件可以包含:
- Cubin:针对具体sm_XX编译的本机GPU代码;
- PTX:可由驱动在目标GPU上JIT编译的中间表示。
Cubin通常只在相同CC主版本内向更高次版本兼容。例如sm_80 cubin可以在 sm_86上运行,但sm_86 cubin不能在 sm_80上运行,也不能跨到sm_90。
PTX可以为未来更高CC提供前向兼容,但需要足够新的驱动来识别该PTX版本,而且JIT编译后的代码不一定充分利用新架构功能。一般是建议同时保留目标架构Cubin和最高目标的PTX,例如:
nvcc kernel.cu -O3 \
-gencode=arch=compute_80,code=sm_80 \
-gencode=arch=compute_90,code=sm_90 \
-gencode=arch=compute_120,code=sm_120 \
-gencode=arch=compute_120,code=compute_120
带a的架构专用目标,例如 sm_90a、sm_100a,可能使用该GPU独有指令,不具备普通PTX的跨架构兼容性。
五、CUDA C++支持
- Linux主机编译器
CUDA 13.3官方支持范围:
| 平台 | GCC | Clang | NVHPC |
|---|---|---|---|
| Linux x86_64 | 6.x-15.x | 7.x-21.x | 26.3 |
| Linux Arm64 SBSA | 6.x-15.x | 7.x-21.x | 26.3 |
NVCC会检查Host Compiler的主版本。超出官方范围时,–allow-unsupported-compiler只能绕过检查,不能保证ABI或编译结果正确。
- C++标准
CUDA 13.3 的NVCC/NVRTC支持C++11、C++14、C++17、C++20、C++23,但存在Host Compiler门槛:
- C++20:GCC 10+、Clang 11+
- C++23:设备端完整支持要求 GCC 14+、Clang 18+ 或相应 NVHPC
- MSVC 的 CUDA Device Code 当前不支持完整C++23
Host Code可以使用Host Compiler 支持的完整 C++。Device Code只支持CUDA文档明确列出的C++特性,普通桌面STL不能默认在设备端使用。设备端应优先使用 CUDA C++、libcu++、Thrust、CUB 中明确支持的组件。
- Windows 编译器
CUDA13.3默认支持:
| 编译器 | IDE | CUDA C++ 标准 |
|---|---|---|
| MSVC 195x | Visual Studio 2026 18.x | C++14、17、20 |
| MSVC 193x | Visual Studio 2022 17.x | C++14、17、20 |
| MSVC 192x | Visual Studio 2019 16.x | C++14、17 |
注意:Visual Studio 2017已从CUDA 12.9起移除支持。
- 32位限制
- CUDA 12.0起移除32位原生编译和交叉编译
- 需要生成32位程序时必须使用更早的Toolkit
- Hopper 不支持32位应用
- Ada是Windows GeForce驱动支持运行32位CUDA应用的最后架构
- 64位设备代码必须与64位Host Code一起使用
六、Python CUDA支持
- CUDA Python
cuda-python是元包,底层cuda.bindings提供CUDA Driver API和Runtime AP 的Python绑定。CUDA Python版本应与使用的CUDA大版本匹配。以CUDA Python 13.x为例,通常要求R580或更高驱动。源码构建时,CUDA Header必须与cuda.bindings的major.minor匹配。
- CuPy
CuPy 14.2官方支持:
- Python3.10-3.14
- CUDA Toolkit 12.0-13.2
- Linux x86_64/aarch64 和 Windows wheel
- CUDA 12 使用cupy-cuda12x
- CUDA 13 使用cupy-cuda
同一环境中只能安装一个 CuPy 包。cupy、cupy-cuda12x、cupy-cuda13x并存会产生冲突。
- PyTorch
PyTorch官方wheel通常自带对应CUDA Runtime和CUDA库,因此使用预编译wheel时,并不要求系统安装完全相同的CUDA Toolkit。但是编译自定义CUDA Extension时仍需要:
- 本地 NVCC
- 与 PyTorch 构建版本兼容的 CUDA Toolkit
- ABI 兼容的 C++ Compiler
- 正确的目标 GPU 架构
可以通过TORCH_CUDA_ARCH_LIST指定扩展包含的架构:
TORCH_CUDA_ARCH_LIST="8.0 8.6 8.9 9.0+PTX" python setup.py build_ext --inplace
+PTX提供更高 CC 的 JIT 前向兼容,但对已知目标 GPU,直接生成对应 Cubin 通常性能更好。
- Numba-CUDA
Numba-CUDA可以安装CUDA 12或CUDA 13依赖,但Kernel只支持Python和NumPy的受限子集。以下内容通常不能直接放入设备代码:
- 任意 Python 对象
- 动态类型和反射
- 普通文件或网络 I/O
- 大部分 CPython 标准库
- 依赖 Python GC 的对象生命周期
- Python Wheel与ABI
Python GPU包还受到CPython ABI限制。例如:
- cp313 wheel 通常不能直接用于CPython 3.12;
- C++ 扩展必须匹配框架使用的C++ ABI;
- PyTorch 的 libtorch_python不能随意使用py_limited_api=True;
- NumPy、PyTorch、CuPy和CUDA 库的大版本升级可能要求重新编译扩展。
七、CUDA Tile限制
- cuTile Python
当前 cuTile Python 要求:
- Linux x86_64、Linux aarch64 或 Windows x86_64;
- GPU Compute Capability 8.x/9.x/10.x/11.x/12.x;
- NVIDIA Driver R580或更高;
- Python 3.10、3.11、3.12、3.13、3.14 或 3.14t;
- 使用系统 Toolkit时要求CUDA 13.1+。
所以cuTile Python不支持Turing、Volta、Pascal等sm_75及更早GPU。
安装方式:
pip install --upgrade "cuda-tile[tileiras]"
pip install cupy-cuda13x
注意:如果不使用这种方式就需要显式的指定版本,请参看前面的安装问题解决
nvidia-cuda-tileiras、nvidia-cuda-nvcc、nvidia-nvvm必须保持相同major.minor版本,否则可能出现编译器组件不兼容。
- CUDA Tile C++
CUDA Tile C++首次正式出现在CUDA 13.3,限定如下:
- CUDA Toolkit 13.3+
- C++20或更高
- 目标GPU为sm_80或更高
- NVCC/NVRTC必须使用–enable-tile
- API在同一Toolkit大版本的minor release内保持兼容,但跨major release可能变化
编译示例:
nvcc --enable-tile -std=c++20 -arch=sm_80 main.cu
NVCC未指定 -arch时可能默认生成sm_75。该架构不支持Tile Code,结果可能编译阶段不生成Tile代码,并在启动Tile Kernel 时失败。
八、部署与验证清单
对于环境兼容性的检查,可以使用下面的方式:
# GPU、CC 和驱动
nvidia-smi --query-gpu=name,compute_cap,driver_version --format=csv
# 系统 CUDA Toolkit
nvcc --version
# CUDA 库解析
ldconfig -p | grep -E 'libcuda|libcudart|libcublas'
import torch
print("PyTorch:", torch.__version__)
print("PyTorch CUDA runtime:", torch.version.cuda)
print("CUDA available:", torch.cuda.is_available())
if torch.cuda.is_available():
print("GPU:", torch.cuda.get_device_name(0))
print("CC:", torch.cuda.get_device_capability(0))
import cupy as cp
cp.show_config()
print("GPU count:", cp.cuda.runtime.getDeviceCount())
在实际的验证中,不能只看nvidia-smi中的CUDA Version那行,而应同时确认GPU CC、驱动、Toolkit、框架自带Runtime、目标架构列表以及C++/Python ABI。
九、总结
这些资料在官方的文档上都可以找到,没有什么可稀奇的。关键是找这个过程比较琐碎。本文将这些内容整理到一起,以后如果发现有什么疏漏或有新增的可以在此基础上进一步的完善。主要是提供一种便捷的查看方法。

4913

被折叠的 条评论
为什么被折叠?



