1. 芯片型号与架构的关系:先搞清楚“蓝图”和“房子”的区别
做 GPU 并行编程的人,早晚会遇到一个绕不开的问题:你对着文档看了一堆架构特性,比如 Tensor Core、NVLink、Infinity Fabric,感觉都懂了,但打开设备管理器或者跑一行nvidia-smi,看到一串像 “GA102”、“Navi 21”、“ACM-G10” 这种编码时,一下子就懵了。这一章就是把“架构”和“芯片型号”之间的对应关系彻底捋清楚。
先打个比方。架构就是一家芯片设计团队画出来的设计蓝图,规定了这个 GPU 的流处理器怎么排布、缓存层级怎么组织、指令集长什么样、支持哪些新功能。而芯片型号,就是按这张蓝图真正流片、量产、贴牌上市的物理产品。同一个架构可以衍生出好几颗规模不同的芯片,比如 NVIDIA 的 Ampere 架构,既有面向数据中心的 GA100,又有面向游戏本的 GA107,中间隔着 GA102、GA104、GA106 好几档。它们共享同一套设计语言,但规格差异巨大。
这个区别对写代码的人来说不是纯理论问题。我见过不少初学者拿着一个为sm_80编译的 CUDA 程序,放到 RTX 3060(sm_86)上跑,发现能运行,就以为万事大吉,结果到了 A100 上又出现莫名其妙的行为差异。归根结底,就是没搞懂“架构版本号”和“具体芯片型号”之间的换算关系。本章的目标很简单:让你看到任何一个 GPU 芯片型号,都能快速说出它属于哪代架构、计算能力版本号是多少、有哪些标志性特性,以及你的并行程序该按什么代际来编译和优化。
适合什么人看?正在学 CUDA、ROCm 或 oneAPI 的开发者,准备采购 GPU 但被各种型号绕晕的工程师,以及想搞明白“为什么新一代显卡运行老内核参数反而变慢”的进阶玩家。如果你已经能把某个架构的特性背得滚瓜烂熟,但看到具体型号还是需要查表,那这一章就是为你准备的。
1.1 从架构到芯片型号:命名背后有规律
GPU 芯片的内部代号其实比市场型号更有规律。以 NVIDIA 为例,芯片代号通常由字母加数字组成,字母代表代际,数字代表规模定位。GA100 里的 GA 是 Ampere 架构的开发代号前缀,100 表示旗舰级;AD102 里的 AD 代表 Ada Lovelace,102 是次旗舰规模。市场型号则完全是另一套逻辑,RTX 4090、A100、H100 这些名字更多是为了品牌营销和产品定位。
AMD 这边规律更直白一些。芯片代号前缀从 GCN 时代的 Tahiti、Hawaii,到 RDNA 时代的 Navi 10、Navi 21、Navi 31,数字越低规模越小,但新架构一定会重新起名。Intel 则用 ACM、BMG 这类前缀区分 Alchemist 和 Battlemage 代际。
很多人只记市场型号,比如“我有一张 RTX 2080 Ti”,却不知道它内部的 TU102 芯片其实和 Quadro RTX 6000 是同一个爹。这不只是冷知识——同一颗芯片,在不同产品上的显存容量、核心频率、功耗墙可能完全不同,直接影响你在写内核代码时的资源假设。
1.2 搞错型号会踩什么坑
- 编译目标选错:CUDA 里
-arch=sm_80和-arch=sm_86不是随意选的,选错会导致性能下降甚至无法运行。 - 误判算力上限:以为 RTX 3050 有 Tensor Core,就以为能跑所有 Tensor Core 优化,忽略了不同代际 Tensor Core 的指令差异。
- 混淆双精度能力:消费级芯片普遍砍掉 FP64 单元,拿 RTX 4090 当计算卡跑双精度模拟,性能可能比老旧的 V100 还差一个数量级。
- 显存带宽误判:只看显存容量不看位宽,结果买的卡跑大矩阵时被带宽卡死。
这些都是真实项目里反复出现过的问题。某实验室的模拟项目组曾把一批 RTX 2080 Ti 当作“便宜的计算卡”用于分子动力学模拟,结果发现 FP64 吞吐量只有 FP32 的 1/32,整体效率远低于预期,最后不得不换方案。这种坑,提前搞清楚芯片型号和架构的对应关系,完全可以避免。
2. NVIDIA 各架构对应的芯片型号全览
NVIDIA 的架构演进线是理解整个 GPU 生态的钥匙。从 2012 年的 Kepler 到 2024 年的 Blackwell,每隔两三年一次大换代,每代架构的芯片型号都有清晰的分层逻辑。
2.1 从 Kepler 到 Turing:计算卡与游戏卡的分道扬镳
Kepler 时代(2012)是第一个大分水岭。GK104 对应 GTX 680/770,GK110 对应 GTX Titan、K20X/K40,GK208 则用于入门级 GT 730。这个时期已经出现了“同一架构、计算卡和游戏卡物理隔离”的趋势,GK110 的完整版几乎都卖给高性能计算市场。
Maxwell(2014)进一步强化了能效比概念,架构分为 GM107/GM204/GM200 三档。GTX 750 Ti 是 GM107,GTX 980 是 GM204,GTX Titan X 和 Tesla M40 用 GM200。很多老项目现在还在用 Maxwell 是因为它对 FP64 的阉割比 Kepler 温和得多。
Pascal(2016)是 CUDA 生态真正的爆发点。GP100 对应 Tesla P100,GP102 对应 GTX 1080 Ti / Titan Xp / Tesla P40,GP104 是 GTX 1080/1070,GP106 是 GTX 1060。Pascal 引入的统一内存编程模型让开发者第一次能比较舒服地写“单卡多流”的异步代码。
Volta(2017)只有一颗 GV100,对应 Tesla V100 和 Titan V。它最大的贡献是引入 Tensor Core,虽然当时很多人觉得这东西是营销噱头,但后来证明这是 AI 时代最关键的硬件决策。Turing(2018)的 TU102/TU104/TU106 三颗芯片覆盖 RTX 2080 Ti / 2080 / 2070 / 2060,同时引入 RT Core,但计算卡层面 Turing 的存在感很弱,Quadro RTX 系列用得多一些。
2.2 Ampere 大爆发:消费级和数据中心全面铺开
Ampere 是命名最容易混淆的一代,因为它的计算能力版本号被分成两套:GA100 对应sm_80,面向 A100 等数据中心计算卡;GA10x 系列对应sm_86,面向 RTX 30 系列消费卡。
具体对应关系如下:
| 市场型号 | 芯片代号 | 计算能力 | 定位 |
|---|---|---|---|
| A100 / A800 | GA100 | 8.0 | 数据中心 |
| RTX 3090 / 3080 Ti / 3080 | GA102 | 8.6 | 旗舰消费 |
| RTX 3070 / 3070 Ti | GA104 | 8.6 | 高端消费 |
| RTX 3060 Ti / 3060 | GA104 / GA106 | 8.6 | 主流消费 |
| RTX 3050 | GA107 | 8.6 | 入门消费 |
| RTX A6000 | GA102 | 8.6 | 专业卡 |
为什么同是 Ampere,sm_80和sm_86要分开?因为 GA100 的 SM 内部结构和 GA10x 有实质差异,比如 L2 缓存大小、Tensor Core 的稀疏化支持、NVLink 的集成方式。写代码时如果只对sm_80编译,放到sm_86上一般也能跑,因为 PTX 可以做兼容,但性能不是最优的。
Ampere 时代还有一个容易忽略的型号分支——GA103。它被用在 RTX 3080 Ti 笔记本版和部分移动工作站上,规格介于 GA102 和 GA104 之间,在 NUC 类的紧凑设备里挺常见。这种“中间芯片”在消费市场不常露面,但在工控和边缘计算设备里经常遇到。
2.3 Hopper、Ada 与 Blackwell:新世代的分化加速
Hopper(2022)只有 GH100 一颗大方片芯片,对应 H100、H200 和部分 GH200 超级芯片方案。它把 Transformer 引擎和 FP8 支持带到了生产环境,NVLink 带宽也上了一个台阶。对普通开发者来说,Hopper 最大的意义是改变了“计算卡必须比消费卡强在 FP64”的旧认知——现在比拼的是低精度 AI 算力和显存带宽。
同一年发布的 Ada Lovelace 架构则是纯消费向。AD102 对应 RTX 4090,AD103 是 RTX 4080,AD104 是 RTX 4070 Ti / 4070,AD106 是 RTX 4060 Ti,AD107 是 RTX 4060。Ada 的 FP32 峰值算力夸张,CUDA 核心数堆得很猛,但 FP64 依然惨遭阉割。做科学计算的朋友如果盯着 RTX 4090 的浮点峰值宣传买卡,买回来跑双精度代码会非常痛苦。
Blackwell(2024)又是新的分水岭。数据中心这边 GB100 对应 B200/B300,计算能力版本号是sm_100,消费级这边 GB202 对应 RTX 5090,计算能力版本号变成了sm_120。这个“10.0 vs 12.0”的割裂比 Ampere 时代更严重,意味着如果你要写一套兼容两个生态的代码,必须同时考虑两套编译路径。
我的建议是:不管 CUDA 版本怎么迭代,代码里尽量用 PTX 兼容级别做兜底,不要焊死在某个sm_目标上。NVIDIA 提供的前向兼容机制值得好好利用。
3. AMD 与 Intel 的架构型号对照
NVIDIA 之外的世界同样精彩。AMD 的 ROCm 生态近几年追赶很快,Intel 的 oneAPI 也在特定领域站稳了脚跟。搞 GPU 并行编程的人如果只看 NVIDIA,视野会窄一半。
3.1 AMD:GCN/Vega 到 RDNA/CDNA 的转型
AMD 的架构线分得非常清楚:GCN 是 2012-2016 年的老设计,Vega 是 GCN 的深度改良版,RDNA 是面向图形和游戏的新设计,CDNA 则是纯计算的独立分支。
GCN 时代的芯片以岛屿命名:Tahiti(HD 7970)、Hawaii(R9 290 / R9 290X)、Tonga(R9 285)。这一代的计算特性其实不错,FP64 比例高于后来的 RDNA,所以很多早期的挖矿和科学计算项目都用它。
Vega 时代有 Vega 10(RX Vega 56/64)和 Vega 20(Radeon VII、Instinct MI50/MI60)。Vega 20 首次在消费卡上提供 1TB/s 级别的 HBM2 显存带宽,这在当时是划时代的。不过 ROCm 对消费级 Vega 的支持一直不温不火,Radeon VII 更多是极客玩具。
RDNA 1 代(2019)用 Navi 10、Navi 14,对应 RX 5700 XT、RX 5500 XT,主打能效。RDNA 2(2020)的 Navi 21/22/23 对应 RX 6900/6800/6700/6600 系列,首次支持硬件光追,但计算生态依然是短板。RDNA 3(2022)的 Navi 31/32/33 对应 RX 7900/7800/7600 系列,引入了 chiplet 设计,Navi 31 由 GCD 加 MCD 组成,这个结构对理解内存带宽分层很有帮助。
CDNA 才是 AMD 认真做计算的方向。Instinct MI100 用的是 Arcturus 芯片,MI200 系列用 Aldebaran,MI300 则是 ExaClass 级别的 APU 混合封装。MI300X 的显存容量做到 192GB,在 LLM 推理场景里很有竞争力。如果你在搞 ROCm 开发,搞清楚 CDNA 和 RDNA 的芯片代号差异是基本功,因为两者的软件栈和编译参数完全不是一回事。
3.2 Intel:从核显到独立显卡的突围
Intel 的 GPU 并行编程生态早期被严重低估。Gen9 架构是 HD Graphics 530/630,藏在各种酷睿处理器里,只适合做 OpenCL 的教学实验。真正有意义的是 Xe 系列。
Xe-LP 对应 DG1 和 Iris Xe 核显,架构代号 DG1 有 96 个 EU,性能很低但胜在功耗。Xe-HPG(Alchemist)是 Intel 第一代独立 GPU,芯片代号 ACM-G10 对应 Arc A770/A750,ACM-G11 对应 Arc A380。Xe-HPC 则是 Ponte Vecchio,面向高性能计算,主打 XMX 矩阵单元,CDMA 能力和 MI300 直接对标。
2024 年底 Intel 发布了 Battlemage 架构,芯片代号 BMG-G21 对应 Arc B580。这一代的 XMX 引擎和光追单元都做了改进,而且 oneAPI 的兼容性比上一代好很多。如果你在学校实验室里接触过 oneAPI 的 SYCL 代码,买一块 Arc 系列做开发板其实很划算——它支持 Level Zero 和 OpenCL,还有不错的视频编解码器。
有一点必须提醒:Intel 的 Arc 显卡在 Linux 驱动上的表现比 Windows 稳定得多,如果你要做计算开发,优先上最新的内核,并确认你的 oneAPI runtime 版本匹配。
4. 规格参数速查:从型号反推架构
现在你已经知道各厂商的架构和芯片型号对应关系,但实际开发中更常用的技能是反推:拿到一张陌生显卡,怎么快速判断它的架构代际和关键规格?
4.1 关键规格对照表
下面的表格整理了各代代表性芯片的核心参数,覆盖 SM/CU 数量、计算能力版本、显存带宽和 FP64 比例:
| 芯片代号 | 架构 | 计算能力 | SM/SE 数 | FP64/FP32 比例 | 典型产品 |
|---|---|---|---|---|---|
| GK110 | Kepler | 3.5 | 15 SM | 1/3 | K40, GTX Titan |
| GM200 | Maxwell | 5.2 | 24 SM | 1/32 | GTX Titan X, M40 |
| GP100 | Pascal | 6.0 | 56 SM | 1/2 | Tesla P100 |
| GV100 | Volta | 7.0 | 80 SM | 1/2 | V100, Titan V |
| TU102 | Turing | 7.5 | 72 SM | 1/16 | RTX 2080 Ti |
| GA100 | Ampere | 8.0 | 108 SM | 1/2 | A100 |
| GA102 | Ampere | 8.6 | 84 SM | 1/64 | RTX 3090 |
| AD102 | Ada | 8.9 | 144 SM | 1/64 | RTX 4090 |
| GH100 | Hopper | 9.0 | 132 SM | 1/2 | H100 |
| Navi 31 | RDNA 3 | - | 48 CU | 1/16 | RX 7900 XTX |
| Aldebaran | CDNA 2 | - | 220 CU | 1/2 | MI250X |
这个表不是让你背的,而是让你建立一种直觉:看到芯片代号数字越大,代表规模越旗舰;看到计算能力版本号,立刻知道对应的指令集特性。比如 8.0 以上才有真正的 TF32 支持,9.0 才有 FP8 原生的高效支持。
4.2 SM/CU、算力版本号的深度解读
SM(Streaming Multiprocessor)是 NVIDIA 的基本执行单元,AMD 叫 CU(Compute Unit),Intel 叫 Xe Core/EU。SM 内部的 Warp 调度器、寄存器堆、共享内存大小,决定了你能在单个 block 里开多少线程、用多少共享内存。
比如 GA102 每个 SM 有 128 个 FP32 核心,而 GA100 每个 SM 也是 128 个 FP32 核心,但 L2 缓存和内存控制器配置完全不同。这就是为什么同样是“128 核心每 SM”,实际跑矩阵乘法时 A100 和 RTX 3090 的差距远大于规格表上的数字。
计算能力版本号更是直接决定你能用哪些 CUDA 特性。sm_80支持异步拷贝(cp.async)、sm_86增加了一些 32 位整数指令的优化、sm_90引入了分布式共享内存和线程块簇。如果你在写多卡通信代码,Hopper 的线程块簇特性可能让你把以前需要协作组 + 多流才能实现的逻辑大幅简化。
AMD 这边没有通用的“计算能力版本号”概念,ROCm 里靠gfxtarget 来区分,比如gfx906是 Vega 20,gfx1030是 Navi 10,gfx1100是 Navi 31。编译的时候你必须指定正确的 target,选错了直接编译失败或运行期崩溃,比 CUDA 的兼容机制更严格。
5. 实操:查询与验证你的 GPU 架构
理论说了这么多,落地才是硬道理。下面是几个我在实际开发环境中一定会跑的查询命令,以及它们的输出怎么解读。
5.1 Linux 下用 nvidia-smi 与 lspci 确认架构
第一步,看卡的型号和完整名称:
nvidia-smi这个输出最上面一行就是 GPU 型号,比如NVIDIA GeForce RTX 4090。但型号只是市场名,我还需要确认芯片代号。跑:
nvidia-smi --query-gpu=name,compute_cap,memory.total,clocks.max.sm --format=csv输出类似:
NVIDIA GeForce RTX 4090, 8.9, 24564 MiB, 2520 MHz这里的8.9就是计算能力版本号,对应 Ada 架构的sm_89。如果你拿到一个8.6,就能确定是 Ampere 消费级芯片(GA10x);如果是9.0,那就是 Hopper 数据中心卡。
如果想看物理芯片编号,lspci更底层:
lspci | grep -i nvidia结果中的[10de:2684]这种格式,前面的10de是 NVIDIA 的 PCI vendor ID,后面的2684是设备 ID。查一下设备 ID 表,就能确认是不是 AD102。这个方法在远程服务器上尤其有用,因为很多云厂商的 GPU 型号会被改名为虚拟型号,但 PCI 设备 ID 骗不了人。
5.2 Windows 与 AMD 平台的查询方式
Windows 下最简单的是任务管理器性能页,能看到 GPU 型号,但看不到计算能力。装一个 GPU-Z 最省事,直接显示芯片代号、流处理器数量、显存带宽、驱动版本。对一些老卡,还能看到 BIOS 的功耗限制,方便判断能不能刷写超频固件。
AMD 平台上,ROCm 环境用rocminfo最直观:
rocminfo这个工具会列出所有 ROCm 可见的 GPU 设备,包括它的gfx目标字符串、CU 数量、显存大小。比如看到gfx1101,就能对应 RDNA 3 的 Navi 33。如果你的代码在编译时用了--offload-arch=gfx1030,而机器实际上是gfx1100,运行时会直接报设备不支持错,这是新手最容易卡住的地方。
Intel 平台可以装 英特尔显卡控制中心,或者用命令行的xpu-smi(oneAPI 自带的工具),能看到 EU 数量和 XMX 状态。对于内置核显的机器,ls /dev/dri/看看有没有renderD128节点就能确认驱动是否正确加载。
5.3 验证一张陌生 GPU 的完整流程
每次拿到新卡,我都按固定流程过一遍:确认市场型号 → 查计算能力版本 → 用实测程序验证关键特性。实测部分我推荐用一个小内核测 FP32 和 FP64 的峰值,再看矩阵乘法的实际吞吐,用这两个数字对比官方规格表,基本就能确认卡有没有被阉割或者是不是刷了 BIOS 的魔改卡。
比如你有两张 RTX 2080 Ti,一张来自某个便宜的整机商,跑 FP32 峰值只有标准的 70%,那很可能散热或供电被限制。这个时候单纯看型号没用,必须跑实测。
6. 常见问题与避坑指南
最后整理一下我在带项目和回答社区问题时遇到的最典型问题,直接给结论,省得你再去翻文档。
6.1 问题速查表
| 现象 | 原因 | 解决办法 |
|---|---|---|
| 同一份 CUDA 代码,A100 上正常,RTX 3090 上性能骤降 | 计算能力 8.0 vs 8.6,部分优化路径分支未覆盖 | 用#if __CUDA_ARCH__做特性分支 |
编译sm_90的代码放到 RTX 4090 上跑不了 | Ada 是 8.9,不是 9.0 | 正确做法是编译sm_89或 PTX 兼容层 |
| ROCm 程序在 RX 7900 XTX 上启动失败 | gfx target 不匹配 | 用rocminfo确认,重编为gfx1100 |
| 计算卡上 FP64 正常,消费卡慢得离谱 | 消费级芯片 FP64 单元被大幅削减 | 确认你的算法是否必须依赖 FP64,考虑混合精度 |
| 同一芯片代号,价格差一倍 | 显存规格、功耗墙、散热方案不同 | 仔细对比规格表,不要只看核心代号 |
最容易被忽略的是第一条。很多人以为同架构就是同一个sm_,但 Ampere 被拆成 8.0 和 8.6 后,代码里如果有针对sm_86才启用的 warp 级原语,在sm_80上即使能编译,运行结果也可能不对。所以我的习惯是:任何内核函数的第一行就判断__CUDA_ARCH__,根据计算能力走不同的优化路径。
6.2 选卡与编译目标选择的经验
如果你是在攒一台深度学习或科学计算的开发机,我的建议是分场景看:
- 纯 LLM 推理:优先显存容量和带宽,RDNA 3 的 MI300 或 NVIDIA 的 H200 这种大显存卡最省心,消费级 RTX 4090 也能跑但 24GB 很快捉襟见肘。
- 传统数值模拟:重视 FP64 比例,V100、A100、MI250X 这类计算卡是正解,别贪图游戏卡的浮点峰值。
- 入门学习 CUDA:随便一块 RTX 3050 或 4060 都够用,关键是确认驱动和 CUDA 版本匹配,不必追求高端。
- 搞跨平台开发:考虑 oneAPI + SYCL,Intel Arc 系列性价比高,但要接受生态还不够完善的现实。
编译目标方面,我的个人准则是:给自己用,直接编译最新的sm_目标;要分发或跨机器跑,编译一个较老的计算能力目标加 PTX 兜底。比如编译-gencode arch=compute_75,code=sm_75 -gencode arch=compute_80,code=sm_80,同时带上compute_80的 PTX,让新驱动可以在未来架构上做 JIT 升级。这套做法虽然会让编译时间变长,但能少掉一大半“换机器就跑不了”的麻烦。
还有一个常被忽略的点:功耗墙。同样一颗 AD102 芯片,在 RTX 4090 公版和非公版上的功耗限制从 320W 到 600W 不等,长时间跑满负载时性能抖动非常明显。如果你写的是跑几个小时的训练脚本,最好在开机时用nvidia-smi -pl 350这类命令把功耗限制固定住,避免驱动动态调度导致的结果不一致。
最后再说一个体感。架构和芯片型号这两层知识,刚接触时觉得记起来很枯燥,但用久了你会发现它其实是一张地图:看到型号,你就知道这卡在完整带宽、缓存层次、指令集支持上分别处于什么位置;看到计算能力版本号,你就知道编译器会拿哪一套指令来喂它。真到了写代码做优化的时候,这套地图能帮你少走很多弯路。我个人踩过最深的坑,就是早期把sm_80和sm_86混为一谈,导致生产环境出了一个很隐蔽的结果不一致问题。从那以后,我不管多着急,拿到新设备第一件事永远是确认架构号,宁可在这一步多花十分钟,也不要在后面调试十个小时。这个习惯,希望对你也一样有效。