简介:本资源是一份系统梳理NVIDIA显卡CUDA算力与版本兼容关系的权威参考文档,面向深度学习工程师、GPU开发者及高性能计算初学者,解决选型时‘某型号显卡支持哪些CUDA版本’‘不同CUDA版本对应哪些计算能力(Compute Capability)’等核心问题。文档以PDF格式呈现,内容涵盖G8x至最新Ampere/Ada架构显卡的完整算力代号(如3.5、6.1、8.6、8.9)、各CUDA Toolkit版本(1.0至11.7)所支持的算力范围、微架构演进对照,以及macOS支持终止(CUDA 10.2起)、二进制兼容性说明等关键细节。资源包仅含1个PDF文件,大小1.17MB,轻量易读,适合作为开发环境搭建前的快速查阅手册。目前已有13582人学习下载,内容源自CSDN社区高频需求整理,结构清晰、数据准确,可直接用于驱动安装、CUDA版本选择与跨平台迁移决策。
1. CUDA详细参数(算力+CUDA支持版本):为什么查对GPU算力和驱动兼容性,比调参还决定模型能不能跑起来
你刚在某实验室服务器上nvidia-smi看到 Tesla V100-SXM2-32GB,兴冲冲pip install torch==2.1.0+cu118,结果import torch报CUDA error: no kernel image is available for execution on the device;或者用新买的 RTX 4090 跑一个老项目,nvcc --version显示 12.2,但编译的.so在运行时直接段错误——这些不是玄学,是 CUDA 算力(Compute Capability)和 CUDA Toolkit / 驱动版本三者没对齐的硬性报错。本篇不讲“CUDA 是什么”,只聚焦一线工程师每天要查、要填、要核对的三组关键参数:GPU 的硬件算力代号(如 7.5、8.6、9.0)、驱动最低要求版本(Driver Version)、CUDA Toolkit 最高/最低支持版本(CUDA Version)。它决定了你能否装上对应 PyTorch/TensorFlow,能否编译成功.cu文件,甚至决定一个预编译 wheel 是否能在你的机器上加载。适合所有需要在多卡、多代 GPU 环境下部署模型的开发者、MLOps 工程师、高校实验室运维人员——别再靠试错来验证兼容性,这张表+这套查法,就是你的后悔药。
2. 查清 GPU 硬件算力:从型号到 compute capability 的精准映射
GPU 的算力(Compute Capability,简称 CC)是 NVIDIA 定义的一组硬件特性集合,它不是性能分数,而是功能开关清单:是否支持 Tensor Core?是否支持 FP16 warp shuffle?是否支持异步内存拷贝?不同 CC 值意味着 CUDA 编译器生成的 PTX/SASS 指令集不同,低算力卡无法执行为高算力卡编译的二进制代码。因此,第一步永远不是装 CUDA,而是确认你手上那块物理卡的准确 CC 值。
2.1 用 nvidia-smi + 官方文档交叉验证(最稳)
nvidia-smi只显示 GPU 型号和驱动版本,不显示算力。常见误区是看到 “RTX 4090” 就默认 CC=8.9 —— 错。RTX 4090 是 Ada Lovelace 架构,CC=8.9;但同属 Ada 的 L40(数据中心卡)是 CC=8.9,而 L4(推理卡)却是 CC=8.9,L40S 是 CC=8.9 —— 看似一样,实则需查证。正确做法是:
- 先用
nvidia-smi -L获取完整设备名(含 PCI ID):
$ nvidia-smi -L 0: NVIDIA RTX A6000 (UUID: GPU-xxxxxx) 1: NVIDIA A100-SXM4-40GB (UUID: GPU-yyyyyy)- 对照 NVIDIA 官方 CUDA GPUs 文档 (注意:必须用当前最新版文档,旧版可能遗漏新卡)。该页按架构分组,每行明确列出型号、架构、CC 值、发布年份。例如搜索 “RTX A6000”,可定位到 Ampere 架构下:
RTX A6000: Compute Capability 8.6
A100-SXM4-40GB: Compute Capability 8.0
提示:文档中 “Architecture” 列(Ampere / Ada / Hopper)比型号名更可靠。同一架构下不同型号 CC 可能不同(如 H100 PCIe 是 9.0,H100 SXM5 也是 9.0),但跨架构一定不同(Turing=7.5,Ampere=8.x,Ada=8.9,Hopper=9.0)。
2.2 用 deviceQuery 工具实测(验证编译环境是否识别正确)
deviceQuery是 CUDA SDK 自带的诊断工具,它会实际调用 CUDA Driver API 查询设备能力,比查文档更“落地”。它能暴露驱动/CUDA Toolkit 是否真能与硬件握手:
# 确保 CUDA 已安装且 PATH 包含 bin 目录 $ which deviceQuery /usr/local/cuda/bin/deviceQuery $ deviceQuery ./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 2 CUDA Capable device(s) Device 0: "NVIDIA RTX A6000" CUDA Driver Version / Runtime Version: 12.4 / 12.2 CUDA Capability Major/Minor version number: 8.6 # ← 这里是真实返回的 CC 值 Total global memory: 48601 MBytes ...注意输出中CUDA Capability Major/Minor version number这一行——它由 GPU 固件和驱动共同决定,若此处显示0.0或报错no CUDA-capable device is detected,说明驱动未正确加载或 CUDA 安装路径混乱,此时查文档也没用。
2.3 常见卡型算力速查表(2023–2024 主流型号)
| GPU 型号 | 架构 | Compute Capability | 备注 |
|---|---|---|---|
| RTX 4090 / 4080 | Ada | 8.9 | 支持 FP8 Tensor Core |
| RTX A6000 | Ampere | 8.6 | 数据中心级,双精度强于消费卡 |
| A100-40GB / 80GB | Ampere | 8.0 | SXM4/SXM5 接口,支持结构化稀疏 |
| V100-SXM2 / PCIe | Volta | 7.0 | 不支持 Tensor Core 的 INT8/FP16 |
| T4 | Turing | 7.5 | 低功耗推理卡,无 FP64 |
| L4 / L40 | Ada | 8.9 | L40 是 8.9,L4 是 8.9(同架构) |
| H100-SXM5 / PCIe | Hopper | 9.0 | 首款支持 FP8 和 Transformer Engine |
注意:“RTX 3090” 是 Ampere,CC=8.6;但 “RTX 3090 Ti” 仍是 8.6,不是 8.7 —— NVIDIA 从未发布过 8.7。CC 值是离散的,不存在小数点后两位随意递增。所有 “8.7”、“8.8” 均为误传。
3. 驱动版本与 CUDA Toolkit 版本:三者兼容性的黄金三角
光知道 GPU 算力还不够。CUDA 生态有三层依赖:GPU 硬件 → NVIDIA 驱动 → CUDA Toolkit → 应用(PyTorch/TensorFlow)。其中驱动和 Toolkit 的版本必须满足 NVIDIA 官方定义的向后兼容规则,否则cudaMalloc都会失败。
3.1 驱动版本决定 CUDA Toolkit 上限(关键!)
NVIDIA 驱动是向下兼容的:新版驱动可运行旧版 CUDA Toolkit 编译的程序;但旧版驱动无法加载新版 Toolkit 编译的模块。例如:
- 驱动版本 515.48.07(2022 年 8 月发布)最高支持 CUDA 11.7;
- 驱动版本 525.60.13(2022 年 11 月)最高支持 CUDA 11.8;
- 驱动版本 535.54.03(2023 年 6 月)最高支持 CUDA 12.2;
- 驱动版本 535.104.05(2023 年 10 月)最高支持 CUDA 12.3;
- 驱动版本 545.23.08(2023 年 12 月)最高支持 CUDA 12.4。
这个关系不是线性增长,而是由驱动内置的libcuda.soABI 版本决定。你可以这样查当前驱动支持的最高 CUDA 版本:
# 方法一:查驱动 release notes(最准) $ nvidia-smi --query-gpu=name,driver_version --format=csv name, driver_version NVIDIA RTX A6000, 535.104.05 # 然后去 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html # 找 “CUDA Toolkit v12.3 Release Notes” → “Supported Operating Systems and GPUs” 表 # 查 “Minimum Required Driver Version” 列:535.104.05 → 支持 CUDA 12.3# 方法二:用 nvidia-smi -q 输出隐含信息(需解析) $ nvidia-smi -q | grep "CUDA Version" CUDA Version : 12.3 # ← 注意:这是驱动声称自己能支持的最高 CUDA 版本,非已安装版本!提示:
nvidia-smi输出的 “CUDA Version” 是驱动支持能力,不是你系统里装了哪个 CUDA。它告诉你:“只要我(驱动)在这,你装 CUDA 12.3 的 toolkit 就能用”。
3.2 CUDA Toolkit 版本决定编译目标算力(-gencode 关键参数)
CUDA Toolkit 安装包自带nvcc编译器,它通过-gencode参数指定生成哪些算力的二进制代码。一个.cu文件编译出的.o文件,可能同时包含sm_75,sm_80,sm_86多个版本的 SASS 代码,运行时由 CUDA Runtime 根据实际 GPU 动态选择。但如果你只指定了sm_86,而用户用的是 V100(CC=7.0),就会报no kernel image is available。
典型编译命令:
nvcc -gencode arch=compute_86,code=sm_86 \ -gencode arch=compute_80,code=sm_80 \ -gencode arch=compute_75,code=sm_75 \ -o my_kernel.o my_kernel.cu参数含义:
arch=compute_86: 生成 PTX 中间码(虚拟指令集),兼容所有 ≥8.6 的卡;code=sm_86: 生成针对 CC=8.6 GPU 的原生 SASS 二进制(最快);- 同时指定多个
gencode,可实现“一次编译,多卡运行”。
血泪经验:PyTorch 官方 wheel 默认编译了
sm_50,sm_60,sm_70,sm_75,sm_80,sm_86,sm_90—— 所以它能在从 M40 到 H100 的全系列卡上运行。但你自己写的 extension,若只写sm_86,就锁死了只能在 A100/A6000/4090 上跑。
3.3 PyTorch/TensorFlow wheel 的 CUDA 版本绑定逻辑
你pip install torch时选的+cu118或+cu121,不是指“用 CUDA 11.8 编译”,而是指:
- 该 wheel 内置的
.so是用 CUDA 11.8 Toolkit 编译的; - 它要求系统驱动 ≥ CUDA 11.8 所需的最低驱动(如 11.8 要求驱动 ≥ 450.80.02);
- 它内部
torch.cuda.get_device_capability()返回的 CC 值,由nvidia-smi+ 驱动决定,与 wheel 无关。
验证方式:
import torch print(torch.__version__) # 2.1.0+cu118 print(torch.version.cuda) # 11.8 print(torch.cuda.get_device_capability(0)) # (8, 6) ← 来自 GPU 硬件 + 驱动,非 wheel所以:wheel 的+cuXX后缀,只约束你系统的驱动版本下限,不约束 GPU 算力。RTX 4090(CC=8.9)可以跑+cu118的 PyTorch,只要驱动够新(≥450.80.02);但 V100(CC=7.0)不能跑只编译了sm_86的自定义 op,哪怕 wheel 是+cu121。
4. 避坑:CUDA 算力与版本兼容的 4 个高频翻车现场
这些不是理论问题,是我在三个不同实验室部署大模型训练 pipeline 时,平均每周都会遇到的真实报错。列在这里,是为了让你少花 3 小时 debug。
4.1 现象:ImportError: libcudnn.so.8: cannot open shared object file
原因:CUDA Toolkit 版本与 cuDNN 版本不匹配。cuDNN 是独立发布的库,每个版本只支持特定范围的 CUDA 版本。例如 cuDNN 8.9.2 仅支持 CUDA 11.8/12.1/12.2,不支持 12.3。而apt install libcudnn8默认装最新版,可能与你export CUDA_HOME=/usr/local/cuda-12.1冲突。
解决:
- 查 cuDNN 官方兼容表( cuDNN Archive );
- 下载与你 CUDA Toolkit 版本严格对应的 cuDNN runfile(如
cudnn-linux-x86_64-8.9.2.26_cuda12.1-archive.tar.xz); - 解压后
sudo cp头文件和 so 到/usr/local/cuda-12.1/对应目录,不要用 apt。
4.2 现象:nvcc fatal : Unsupported gpu architecture 'compute_90'
原因:你升级了 CUDA Toolkit 到 12.3,但nvcc仍指向旧版本(如/usr/local/cuda-11.8/bin/nvcc),而旧版 nvcc 不认识 Hopper 架构的compute_90。
解决:
which nvcc确认路径;nvcc --version看实际版本;- 若不一致,
export PATH=/usr/local/cuda-12.3/bin:$PATH并重 source; - 永久生效:写入
~/.bashrc或/etc/profile.d/cuda.sh。
4.3 现象:CUDA error: no kernel image is available for execution on the device
原因:最常见于自定义 CUDA Extension。你用setup.py编译时,TORCH_CUDA_ARCH_LIST环境变量未设置,或只设了8.6,但运行时 GPU 是7.5(如 T4)。PyTorch 默认只编译当前主卡的算力,不自动 fallback。
解决:
# 编译前显式指定多算力(空格分隔) export TORCH_CUDA_ARCH_LIST="7.5 8.0 8.6 8.9 9.0" python setup.py build_ext --inplace注意:
TORCH_CUDA_ARCH_LIST是 PyTorch 的约定,不是 nvcc 原生命令。它会被 PyTorch 的cpp_extension模块读取并转为-gencode参数。
4.4 现象:nvidia-smi正常,但torch.cuda.is_available()返回 False
原因:驱动与 CUDA Toolkit 的libcuda.so/libcudart.so版本冲突。典型场景:系统装了驱动 535,但LD_LIBRARY_PATH指向/usr/local/cuda-11.7/lib64(含旧版libcudart.so.11.7),而 PyTorch 2.1 要求libcudart.so.11.8。
解决:
ldd $(python -c "import torch; print(torch.__file__)") | grep cuda查依赖的 so;find /usr/local/cuda* -name "libcudart.so.*"找所有版本;export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH强制优先加载;- 更彻底:卸载旧 CUDA Toolkit,只保留一个版本。
5. 实战:用 Python 脚本一键校验本地 CUDA 兼容性
手动查表、比对版本太慢。我写了一个轻量脚本cuda_check.py,它不依赖任何外部库(只用标准库 +subprocess),5 秒内输出你环境的完整兼容快照。它解决了三个核心问题:
- 当前 GPU 型号 → 算力值(调用
deviceQuery或 fallback 到nvidia-smi+ 查表); - 驱动版本 → 支持的最高 CUDA 版本(查 NVIDIA 官方 release notes JSON);
- 已安装 CUDA Toolkit → 是否在驱动支持范围内(比对
nvcc --version与驱动上限)。
5.1 脚本核心逻辑与使用方式
#!/usr/bin/env python3 # cuda_check.py - 本地 CUDA 兼容性快照生成器 import subprocess import json import sys import re def get_gpu_info(): try: out = subprocess.check_output(['nvidia-smi', '-L'], text=True) gpus = [line.split(': ')[1].split(' (')[0].strip() for line in out.strip().split('\n')] return gpus[0] if gpus else "Unknown GPU" except: return "No GPU detected" def get_driver_version(): try: out = subprocess.check_output(['nvidia-smi', '--query-gpu=driver_version', '--format=csv,noheader,nounits'], text=True) return out.strip() except: return "N/A" def get_cuda_version(): try: out = subprocess.check_output(['nvcc', '--version'], text=True) m = re.search(r'release (\d+\.\d+)', out) return m.group(1) if m else "N/A" except: return "N/A" def get_compute_capability(gpu_name): # 简化版映射表(生产环境建议用 JSON 文件维护) cc_map = { "RTX 4090": "8.9", "RTX 4080": "8.9", "RTX A6000": "8.6", "A100": "8.0", "V100": "7.0", "T4": "7.5", "L4": "8.9", "H100": "9.0" } for key in cc_map: if key in gpu_name: return cc_map[key] return "Unknown" def main(): gpu = get_gpu_info() driver = get_driver_version() cuda = get_cuda_version() cc = get_compute_capability(gpu) print(f"GPU Model: {gpu}") print(f"Compute Cap: {cc}") print(f"Driver Ver: {driver}") print(f"CUDA Toolkit: {cuda}") # 驱动支持的最高 CUDA 版本(简化逻辑,实际应查官方 JSON) driver_to_max_cuda = { "515.48.07": "11.7", "525.60.13": "11.8", "535.104.05": "12.3", "545.23.08": "12.4" } max_cuda_by_driver = "Unknown" for drv, max_cu in driver_to_max_cuda.items(): if driver.startswith(drv.split('.')[0]): # 粗略匹配主版本 max_cuda_by_driver = max_cu break print(f"Driver supports up to CUDA: {max_cuda_by_driver}") if cuda != "N/A" and max_cuda_by_driver != "Unknown": cuda_major = float(cuda) max_major = float(max_cuda_by_driver) if cuda_major > max_major: print("❌ WARNING: CUDA Toolkit version exceeds driver support!") print(f" Your driver {driver} only supports up to CUDA {max_cuda_by_driver}") else: print("✅ OK: CUDA version is within driver support range.") if __name__ == "__main__": main()逻辑说明:
get_gpu_info()用nvidia-smi -L提取型号,避免lspci的模糊匹配;get_compute_capability()是简化版查表,实际项目中应替换为从 NVIDIA 官方 CSV 下载并缓存的完整映射(含 PCI ID);- 驱动到 CUDA 的映射表
driver_to_max_cuda是静态的,因为 NVIDIA 不会为旧驱动追加新 CUDA 支持;- 脚本不联网,不依赖
requests,适合在无外网的集群节点运行。
5.2 运行效果与解读
$ python cuda_check.py GPU Model: NVIDIA RTX A6000 Compute Cap: 8.6 Driver Ver: 535.104.05 CUDA Toolkit: 12.3 Driver supports up to CUDA: 12.3 ✅ OK: CUDA version is within driver support range.这表示:你的 A6000(CC=8.6)配驱动 535.104.05(支持 CUDA 12.3 上限)+ CUDA 12.3 Toolkit,三者完全对齐,可安全安装 PyTorch 2.1+cu121 或 2.2+cu121(它们都要求 CUDA ≥12.1)。
若输出❌ WARNING,说明你必须:
- 升级驱动(推荐),或
- 降级 CUDA Toolkit(不推荐,因新 Toolkit 修复大量 bug)。
6. 进阶技巧:如何为跨代 GPU 集群构建统一 wheel
在某高校超算中心,我们管理着含 V100(CC=7.0)、A100(CC=8.0)、A6000(CC=8.6)、H100(CC=9.0)的混合集群。用户提交作业时,不指定 GPU 类型,调度器随机分配。此时,若每个用户都pip install自己编译的 extension,必然出现no kernel image报错。解决方案不是让所有人改代码,而是构建一个“全算力兼容”的 wheel。
6.1 编译阶段:TORCH_CUDA_ARCH_LIST 的科学设置
PyTorch 的cpp_extension通过环境变量TORCH_CUDA_ARCH_LIST控制编译目标。关键原则:
- 不漏:覆盖集群中所有 GPU 的 CC;
- 不冗:不编译未使用的算力(增加 wheel 体积,延长加载时间);
- 不越界:不编译高于驱动支持的算力(如驱动只到 12.2,却编译
sm_90,nvcc 会报错)。
我们集群的 CC 清单:7.0 8.0 8.6 9.0。对应设置:
export TORCH_CUDA_ARCH_LIST="7.0 8.0 8.6 9.0" # 注意:不要写成 "7.0+PTX",PyTorch 不识别 +PTX 语法然后执行:
python setup.py bdist_wheel # 生成的 wheel 名类似:myop-0.1-py3-none-manylinux2014_x86_64.whl6.2 验证 wheel 是否真含多算力
wheel 本质是 zip 包。解压后检查.so文件是否嵌入多段 SASS:
unzip -l myop-0.1-py3-none-manylinux2014_x86_64.whl | grep ".so" # 输出:myop/_myop.cpython-310-x86_64-linux-gnu.so # 用 strings 查看二进制中的算力标识 strings myop/_myop.cpython-310-x86_64-linux-gnu.so | grep "sm_" # 应看到:sm_70 sm_80 sm_86 sm_90提示:
strings输出中若只有sm_86,说明TORCH_CUDA_ARCH_LIST未生效,检查是否在setup.py执行前 export。
6.3 运行时动态选择:PyTorch 如何加载正确 SASS
PyTorch Runtime 不是“加载所有 SASS”,而是:
- 调用
cudaGetDeviceProperties(&prop, device, 0)获取当前 GPU 的major/minor; - 在
.so的 ELF section 中查找匹配的sm_xx段; - 若未找到 exact match,则尝试加载
compute_xxPTX 段(需 GPU 支持 JIT 编译); - 若两者皆无,才报
no kernel image。
因此,为 H100(CC=9.0)编译的sm_90代码,在 A100(CC=8.0)上不会被加载,也不会报错——它只是被跳过。这就是多算力 wheel 安全的底层机制。
6.4 生产环境 checklist(我们每天 deploy 前必做)
| 检查项 | 命令/方法 | 通过标准 |
|---|---|---|
| GPU 型号与 CC 一致 | nvidia-smi -L+ 查 NVIDIA 官网 | 型号匹配,CC 值确认无误 |
| 驱动支持 CUDA 上限 | nvidia-smi -q | grep "CUDA Version" | ≥ 你计划安装的 CUDA Toolkit 版本 |
| CUDA Toolkit 版本 | nvcc --version | 与 PyTorch wheel 的+cuXX后缀一致 |
| 多算力编译生效 | strings xxx.so | grep sm_ | 输出包含集群所有 CC 值 |
| wheel 在目标卡运行 | python -c "import myop; print(myop.test())" | 在 V100/A100/H100 上均不报no kernel image |
最后说一句血泪教训:在混合集群上,永远不要相信“它以前能跑”。GPU 型号、驱动版本、CUDA Toolkit、PyTorch 版本,任意一个变了,兼容性就要重验。我把cuda_check.py放进 CI 流程,每次 merge PR 前自动跑,省下无数半夜救火时间。希望帮到你。
本文还有配套的精品资源,点击获取