一条 LDG.E 指令,32 个线程,各取 4 个字节,加起来 128 字节。如果 L1 缓存命中,它 15 纳秒就能返回。如果一路 miss 穿到 DRAM,就变成了 255 纳秒。
255 纳秒是什么概念?光在真空中只能传播 76 米。但对于一个以 2.52 GHz Boost 时钟运行的 RTX 4090 来说,这 255 纳秒足够让它空转超过 640 个周期。
为什么 AI 训练和推理对显存带宽如此饥渴?为什么每次 GPU 架构升级,缓存系统都是核心战场?答案就藏在这条指令从发射到返回的全路径里——一条英伟达从未完整公开过的微架构迷宫。
从 warp 到 DRAM:4 个字节的漫长征途
故事的起点在流式多处理器(SM)内部。RTX 4090 搭载的 AD102 芯片拥有 144 个 SM,但出于芯片分级的商业策略,RTX 4090 实际启用了 128 个。每个 SM 被划分为 4 个子分区,每个子分区有自己的调度器、寄存器堆和数据通路。
这个 warp 被分配在其中一个子分区上,与其他 11 个 warp 共享调度器的时隙。每个周期,子分区调度器从 12 个 warp 中挑选一个可执行的,在 32 个通道上同时发射其下一条指令。我们的 warp 赢了两次:第一次发射 IMAD.WIDE 计算地址,几个周期后地址已就位在 R4 和 R5 中,第二次轮到 LDG.E。
寄存器阶段:1 个周期
LDG.E R4, [R4.64] 是一条 32 位全局加载指令,从 64 位地址指向的内存位置读取数据存入 R4。寄存器堆的一行同时保存所有 32 个通道的 R4,另一行保存 R5。两条寄存器行被读出,产生 256 字节数据——32 个独立的 64 位地址,每个通道一个。
寄存器读取最多耗费 1 个周期。同样从寄存器取地址的共享内存加载需要 24 个周期(从发射到首次使用);而地址作为立即数的同一操作只需 23 个周期。LDG 没有立即数模式,多出的 1 个周期正是从寄存器获取地址的开销。
合并器:32 个请求压缩为 4 个
地址就绪后,指令传入 Load/Store 单元(LSU)。LSU 进行地址运算后,将操作码、32 位活跃通道掩码、计算后的地址和目标寄存器编号送入下一站:合并器。
合并器做了一件精巧的事。每个 LDG.E 指令只请求 4 字节,但下一个目的地——L1 缓存——以 32 字节的 sector 为寻址单位。合并器的任务就是判断最少需要多少个 L1 sector 来满足这 32 个 4 字节请求。结果是 4 个连续的 sector 请求,正好 128 字节,构成一条 cache line。
L1 缓存:15 纳秒的分界线
4 个 sector 请求被发送到 L1 缓存。RTX 4090 的 L1 是一个统一的 128 KB 缓存(与共享内存共用物理 SRAM),采用 4 路组相联设计,每路 128 字节 cache line。
一个地址落在哪个 set 中,并不是简单的按比特截取——英伟达使用了一套复杂的奇偶校验哈希方案。这样做的原因很实际:矩阵和张量运算的 stride 访问模式(比如按列读取)如果碰到简单截取,会持续命中同一个 set 导致频繁驱逐,而奇偶哈希能让地址更均匀地分布。
L1 使用虚拟地址进行查询,省去了地址翻译的开销。如果 tag 匹配且所需 sector 已在缓存中,即为命中。L1 命中约需 15.4 纳秒(约 40 个核心周期)。
但这是第一次加载,L1 必然 miss。请求继续下沉。
TLB 和 Crossbar:跨越芯片的旅程
从 L1 下沉时,虚拟地址需要翻译为物理地址。TLB(页表缓存)完成翻译后,请求踏上芯片内部的跨 bar(crossbar)——这是一条连接 SM 集群和 L2 缓存的片上互联网络。
跨 bar 的延迟在总时延中占据显著比例,因为 AD102 芯片拥有超过 760 亿个晶体管,die 面积大约 600 mm²。信号从 SM 端跨越到 L2 端需要走过物理线路。
L2 缓存:36 个独立 slice 的迷宫
L2 缓存是 Ada Lovelace 架构升级的核心。上一代 Ampere(GA102)只有 6 MB L2,而 AD102 将 L2 暴增至 96 MB——整整 16 倍。RTX 4090 启用了其中 72 MB。
这 72 MB 被划分为 36 个独立的 slice,每个 slice 拥有自己的数据阵列和标签阵列。一个地址落在哪个 slice 由三个独立的哈希函数决定:两对地址奇偶校验和一个 mod-3 数字。RTX 4090 有 12 个内存控制器(对应 384 位总线的 12 个 32 位通道),每个控制器管理 3 个 slice。
这个分配函数的恢复过程本身就揭示了英伟达架构的秘密。Doubleword 团队的做法是:找到一组全部映射到同一个 L2 slice 的地址指针,它们的加载速度比均匀分布在所有 slice 上的指针慢约 36 倍——因为所有请求在一个 slice 上被顺序排队。当你知道慢 36 倍就是正确的分配函数时,你就知道找到了答案。
L2 命中时延约为 127 纳秒。
DRAM:255 纳秒的终点站
L2 也 miss 了。请求通过内存控制器到达 GDDR6X 显存。
DRAM 芯片内部的组织方式决定了延迟的构成。存储空间被划分为行(row)和列(column)。RTX 4090 的每一行是 1 KiB——即 32 个 32 字节的列。我们的 4 个 sector 正好命中同一行中的 4 个列。
但前提是这一行已经被激活。如果前一次访问的是另一行,你必须先关闭当前行缓冲(precharge),激活新行(activate),然后才能读取列数据。整个操作序列的端到端时延约 255 纳秒。
如果连续读取落在同一行内,每次额外读取只增加约 3.4 纳秒。而每次打开新行,代价是约 15 倍的延迟惩罚。
数据从 DRAM 原路返回:DRAM → L2(写入缓存)→ Crossbar → L1(写入缓存)→ 寄存器 R4。一个完整的加载循环就此结束。
精密的代价:英伟达的架构哲学,写在每一纳秒里
纵观整条路径,有两点尤为突出。
第一点是缓存层级的精密程度远超 CPU。CPU 的缓存层次已经标准化——L1 约 1 纳秒,L2 约 5 纳秒,L3 约 15 纳秒,DRAM 约 50 纳秒。GPU 的每一项延迟数字都要差得多(15 ns / 127 ns / 255 ns),但 GPU 依靠大规模并发来掩盖延迟:一个 warp 等待内存时,调度器立刻切换到另一个 warp 执行,12 个 warp 的轮转足以隐藏大部分内存延迟。
这种架构选择带来了一个后果:GPU 的缓存系统不追求最低延迟,而是追求最高吞吐和最聪明的逐出策略。这正是为什么 Ada Lovelace 的 L1 使用奇偶哈希而非简单截取,L2 被分割为 36 个独立 slice 并采用三哈希路由——每一个决策都是在为吞吐服务,而非延迟。
第二点是英伟达的文档哲学。Fergus Finn 在文章中直言:英伟达没有文档化这些细节,至少没到我们需要的深度。所有数据都来自硬件微基准测试——通过精心设计的 eviction set(驱逐集)反推 L1/L2 大小、组相联度、slice 映射函数和 DRAM row 大小。这种用时序实验测量物理极限的方法,本身就揭示了英伟达架构策略的另一面:
- 开放 PTX(中间表示),让编译器开发者和高级库能够获得良好的性能;
- 对 SASS(最终机器码)和微架构细节保持缄默,甚至用 LOP3 这类拥有 256 种模式的多功能指令增加逆向工程难度;
- 通过 cuDNN、TensorRT 等闭源库锁定极限性能优化路径。
这形成了一种精巧的知识不对称。普通的 CUDA 开发者通过高层 API 就能获得不错的性能。但要在英伟达硬件上榨出最后 10%,你必须依赖英伟达自己的闭源优化库。AMD 的 ROCm 之所以多年追赶乏力,原因不仅在于软件栈成熟度——更在于,没有如此详尽的微架构工程知识积累,你就不知道在该优化什么。
护城河的真正厚度:不是算力,是时间
从 Ampere 到 Ada Lovelace,英伟达把 L2 缓存从 6 MB 提升到 96 MB,同时降低了延迟、提升了带宽。Tom's Hardware 在架构分析中指出,这是针对 AMD Infinity Cache 的直接回应。但英伟达选择保留传统两级缓存设计而非引入 L3,因为 L2 的延迟特性天然优于 L3。
这种不增加层级、只扩大容量的选择,让 Ada 在内存密集型的 AI 推理负载中获得了显著的性能提升。但代价是设计复杂度飙升:36 个独立 slice 的三哈希路由、跨 12 个内存控制器的分段管理、被奇偶校验哈希保护的 L1 set 索引——每一个细节都在燃烧半导体设计和验证的巨额工程投入。
AMD 的 RDNA 3 和 Intel 的 Arc 系列在架构层面并非没有创新。但差距在于:英伟达在这条路径上已经迭代了 15 年——从 2008 年 GT200 引入统一架构,到 Fermi 的专用 L1/L2 缓存,到 Kepler 的 SMX 分区设计,再到 Volta 的独立线程调度,再到 Ampere 的 unified L1,再到 Ada 的 96 MB L2。每一个微架构层次都经过了个体优化。逆向工程团队每还原一层细节,发现的都是精心权衡后的设计决策,而非偶然。
对于 AI 开发者和行业观察者而言,理解这些底层细节的价值远不止于写更好的 CUDA kernel。它解释了为什么每次 GPU 架构升级,AI 训练的性价比曲线都以超摩尔定律的速度下降——不是因为制程进步,而是因为每一代的缓存系统、内存控制器和内部互联都经过了重新设计。TSMC 4N 工艺给了晶体管密度,但把 760 亿个晶体管变成有用的性能,需要的就是从 register file 到 DRAM row buffer 的每一纳秒的优化。
一条指令从发射到返回要走 255 纳秒。英伟达为此花了 15 年去优化其中的每一纳秒。这才是它真正的护城河:不是算力,是时间本身。






快报