并行编程程实践—NVIDIA GPU及相关软件生态的分析

一、概念说明

对于很多从事GPU编程者来说,NVIDIA公司是无法绕开的概念。虽然国内和国外有着大量的竞争对手,但随着马斯克确定将未来的GPU集群使用的硬件绑定到NVIDIA的GPU,这是什么意义大家应该都明白了。所以对于广大的开发者来说,NVIDIA GPU的开发可以作为一种重要的开发路径,再遇到其它实际GPU后,也可以很好的进行相关的扩展。怎么说呢?至少到现在,大家的技术路线应该整体都差不多,不会有太革命的技术出现。否则NVIDIA也可以放弃了。
扯回来,在学习CUDA编程时,遇到了很多基础的技术细节问题。这些细节是一些环境指标的技术细节,与真正的技术关系并不大,但在安装各种环境和开发时又都需要。所以在经历了反复安装和实际操作应用的过程后,对其进行一些全面的整理,供大家借鉴。
总结以到目前为止,NVIDIA的GPU和CUDA的相关软硬件最新版本为止。

  1. GPU发展版本(硬件)

NVIDIA公司从推出GPU到现在,经历了很多的版本或者说代际的发展。大家熟悉的什么gtx960,rtx 5060等,这都是某个版本或代际的实际的产品型号。大家不要将二者混淆。根据NVIDIA公司的推出先后顺序,经历以下几个版本(时间线从前到后):
Fermi、Kepler、Maxwell、Pascal、Volta、Turing、Ampere、Ada、Hopper、Blackwell。它们代表着NVIDIA GPU的硬件架构不同版本或代际的命名。每一代架构会改变SM(Streaming Multiprocessor)、缓存、调度、Tensor Core、显存和互联等硬件能力

  1. 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 等数据中心能力更强。

  1. 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 支持范围
Tesla1.x8800、Tesla C1060CUDA SIMT起点,功能和编程能力有限早期CUDA,当前已淘汰
Fermi2.0/2.1C2050、GTX 580L1/L2 Cache、ECC、并发 Kernel、较完整C++CUDA 3.0 至 8.0
Kepler3.0/3.2/3.5/3.7K20、K40、K80Dynamic Parallelism、Hyper-Q、warp shuffle最晚CUDA 10.2或11.x
Maxwell5.0/5.2/5.3M40、GTX 980显著提高能效、共享内存和原子操作性能CUDA 6.5 至 12.x
Pascal6.0/6.1/6.2P100、P40、GTX 1080、Jetson TX2HBM2、首代 NVLink、FP16、统一内存按需迁移CUDA 8.0至12.x
Volta7.0/7.2V100、Jetson Xavier第一代Tensor Core、独立线程调度、Cooperative GroupsCUDA 9.0至12.x
Turing7.5T4、RTX 20Tensor Core增加 INT8/INT4,RT Core,FP/INT 并发CUDA 10.0起,仍支持
Ampere8.0/8.6/8.7A100、A30、RTX 30、Jetson OrinTF32、BF16、稀疏 Tensor Core、异步拷贝、A100 MIGCUDA 11.0 起
Ada8.9L40S、RTX 40第四代 Tensor Core、第三代RT Core,更强推理与能效CUDA 11.8 起
Hopper9.0H100、H200、GH200FP8 Transformer Engine、TMA、DPX、Thread Block ClusterCUDA 11.8 起
Blackwell 数据中心10.0/10.3B200、GB200、B300、GB300NVFP4、第五代Tensor Core、Tensor Memory、NVLink 510.0 从CUDA 12.8;建议 13.x
Blackwell Jetson11.0Jetson T4000/T5000面向边缘AI的Blackwell分支建议CUDA 13.x/对应 JetPack
Blackwell RTX12.0RTX 50、RTX PRO BlackwellBlackwell图形、AI和神经渲染能力CUDA 12.8 起
Blackwell GB1012.1DGX SparkGrace 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与驱动兼容性

  1. 大版本兼容范围
Toolkit 系列Minor Version Compatibility 最低驱动典型范围
CUDA 11.xR450通常为 >=450,<525
CUDA 12.xR525通常为 >=525,<580
CUDA 13.xR580新驱动继续向后兼容

CUDA 13.3 Update 1 的完整配套 Linux 驱动版本为 >=610.43.02。在CUDA 13.x的最低兼容驱动R580上运行时,部分同时依赖Toolkit和新驱动的功能可能不可用。
大家可以参考前面安装rtx pro 4000时的相关分析说明,对照一下。

  1. 兼容规则
  • 向后兼容:新驱动通常能运行由旧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)
  1. 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++支持

  1. Linux主机编译器

CUDA 13.3官方支持范围:

平台GCCClangNVHPC
Linux x86_646.x-15.x7.x-21.x26.3
Linux Arm64 SBSA6.x-15.x7.x-21.x26.3

NVCC会检查Host Compiler的主版本。超出官方范围时,–allow-unsupported-compiler只能绕过检查,不能保证ABI或编译结果正确。

  1. 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 中明确支持的组件。

  1. Windows 编译器

CUDA13.3默认支持:

编译器IDECUDA C++ 标准
MSVC 195xVisual Studio 2026 18.xC++14、17、20
MSVC 193xVisual Studio 2022 17.xC++14、17、20
MSVC 192xVisual Studio 2019 16.xC++14、17

注意:Visual Studio 2017已从CUDA 12.9起移除支持。

  1. 32位限制
  • CUDA 12.0起移除32位原生编译和交叉编译
  • 需要生成32位程序时必须使用更早的Toolkit
  • Hopper 不支持32位应用
  • Ada是Windows GeForce驱动支持运行32位CUDA应用的最后架构
  • 64位设备代码必须与64位Host Code一起使用

六、Python CUDA支持

  1. 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匹配。

  1. 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并存会产生冲突。

  1. 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 通常性能更好。

  1. Numba-CUDA

Numba-CUDA可以安装CUDA 12或CUDA 13依赖,但Kernel只支持Python和NumPy的受限子集。以下内容通常不能直接放入设备代码:

  • 任意 Python 对象
  • 动态类型和反射
  • 普通文件或网络 I/O
  • 大部分 CPython 标准库
  • 依赖 Python GC 的对象生命周期
  1. 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限制

  1. 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版本,否则可能出现编译器组件不兼容。

  1. 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。

九、总结

这些资料在官方的文档上都可以找到,没有什么可稀奇的。关键是找这个过程比较琐碎。本文将这些内容整理到一起,以后如果发现有什么疏漏或有新增的可以在此基础上进一步的完善。主要是提供一种便捷的查看方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值