☰
CPU三级缓存与GPU二级缓存:芯片架构背后的设计逻辑
2026/10/14 6:04:33 网站建设 项目流程

聊到芯片架构,CPU 和 GPU 在缓存设计上的差异,是我这些年最常拿来考校新人的一道“灵魂问题”:为什么 CPU 设计了三级缓存,而 GPU 通常只有二级缓存?这问题看着像参数对比,实际上十句话就能讲完表面答案,但真要把它讲透,能串起延迟隐藏、面积预算、局部性原理、一致性协议这些东西,几乎等于把计算机体系结构最核心的思路过了一遍。不管你是做应用开发的、搞性能调优的,还是单纯好奇硬件原理的,我都建议把这个问题当成一把钥匙,拿它去打开整张芯片设计的蓝图。

1. 先把CPU的三级缓存解剖开

1.1 为什么要设计一层层的中转

CPU要跑的现代桌面系统和通用应用,逻辑链条长、分支复杂,而且对单线程延迟极其敏感。但芯片外部的DRAM内存,和CPU核心的运算速度之间存在一个数量级的鸿沟:主频轻松到几GHz,访问一次主存却要付出上百个周期的代价。如果每个数据都从内存里现场取,CPU绝大多数时间都会卡在等待数据上,算力几乎归零。

所以 CPU 引入了一小块靠近核心的超高速SRAM,把最近用过的数据先存起来,下次要用直接命中。这块SRAM就是缓存,而且不是一块,是分层的多块。这就像你不可能把所有资料都堆在办公桌上,但可以把最常用的几份放手边,次要的放文件柜,更远的放档案室,再远的放到库房。缓存层级就是为同一个问题设计的:越靠近核心越快,但容量越小、造价越贵;越往外容量越大、成本越低,但延迟越差。所谓三级缓存,本质上是“容量、速度、成本”三者按比例妥协的产物。

1.2 三个级别各自的分工定位

L1缓存是离核心最近的,通常分成指令缓存和数据缓存,各自单独一块,容量大致在几十KB到上百KB这个量级。它的访问延迟能压到几个周期,命中率高得惊人,一般能到90%甚至更高。但这块SRAM面积和功耗都很贵,想做大容量根本不可能,只能追求极高命中率的高频命中。

L2缓存是L1的直接后备。单个核心专属或者两个核心共享一份,容量常见是每个核分配1MB到数MB不等。L1没命中的数据会落到L2里,L2命中延迟大约能控制在十几到几十个周期,相比主存已经非常快了。L2的职责是承接L1溢出的访问压力,让数据和指令在二级空间里有缓冲余地,不至于一漏就跌回内存。

L3缓存则是多个核心共享的一层大池子,容量能到几十MB级别,延迟在几十到上百个周期徘徊。它不再为单个核心服务,而是为整个处理器服务:当某个核心写出一份数据,别的核需要从L3拿到更新版本;当L2未命中时,L3往往是最后一个缓存层面的机会,再往下就是访问内存了。实际上,主流桌面CPU的设计中,L3往往还承担与内存控制器、图形核心、各类加速引擎之间的数据中转角色。

1.3 L3不是随便加的“大个L2”

很多人以为L3只是把L2做得更大,这是最常见的一个误区。L3的出现,更大程度上是为了解决多核对共享数据的“归属问题”。试想一下:如果芯片上没有L3,两个核心各自拿着自己的L2,芯片对外访问内存时,必须有一套复杂的机制保证数据一致,否则A核在L2里改了值,B核却还拿旧数据在算。核心数量越多,这套跨核的缓存一致性维护就越贵。

加了L3之后,所有核围绕一个共享枢纽来同步数据,相当于大家把“重要公共文件”都放在同一个档案室里,谁要改都知道该去哪登记。设计上可以采用环形总线、网状总线把各个核连到L3,一致性协议中的共享状态、修改状态都可以在L3统一追踪。这样一来,既降低了多核扩展的复杂度,也避免了对每个私有L2要求过高的一致性支持。所以L3的定位不是“更大的缓存”,而是“多核协同的总线节点兼数据归属点”。

2. GPU的缓存其实只有两级

2.1 SM私有的L1缓存到底是什么

GPU的执行组织方式跟CPU完全不一样。一个GPU内部由大量流式处理器簇组成,每一组簇通常被称作一个SM。每个SM会运行若干线程束,一个线程束一般是32个线程,并且这些线程共享一条取指流水线、以锁步的方式执行。这个“锁步并行”的设定,决定了GPU里每个SM都需要一个属于自己的L1缓存,用来保存这个SM内部频繁访问的局部数据。

这块L1在架构上还会被进一步拆成几个用途:一份用于普通的全局内存访问的缓存,一份用于纹理数据的缓存,还可能配一份用于常量数据的只读缓存。它们都是SM私有的,其他SM不可见、不可共享。因为GPU程序是SIMT模式,同一个线程束里的32个线程如果要读取同一块数据或相邻数据,L1能做的就是把多次访问合并,减少从L2或显存兑现的请求数。这块L1的容量通常不大,每SM大约128KB到256KB,但它的目标是过滤高频重访,而不是保存大规模工作集。

2.2 全局共享的L2才是GPU缓存的中枢

GPU的第二层就是全局共享的L2,整块GPU只有一个L2缓存“池”,不过物理上会被切成很多个slice,分布在芯片的不同方位,通过一个强大的交叉互联网络连接到所有SM。L2的容量在各类架构上差距很大,从几MB到数十MB都有,但整体趋势是越来越大。它的位置和职责,有点像CPU里的L3:所有SM都在这一层汇合,跨SM的数据共享、原子操作、同步锁都要落到L2上完成跨芯片层面的协调。

但要说清楚的是,GPU的L2之上没有L3,直接在L2之后面对的就是显存或统一内存系统。现代GPU使用高带宽的GDDR或HBM显存,带宽动辄几百GB/s甚至更高,但延迟依然高昂,远高于L2命中的延迟。虽然L2容量看似不小,但相比之下,面对动不动就是8GB、16GB甚至几十GB的总显存容量,L2命中率只能发挥“整理流量”的作用,而不是试图承担全部工作集。也就是说,GPU设计者根本没有想让L2把绝大多数数据都兜住,这跟CPU对缓存体系的期望完全不是一回事。

3. 为什么同是缓存,GPU偏偏差了一级

3.1 一个靠缓存降延迟,一个用并发藏延迟

这个问题最核心的答案,就两个词:延迟和吞吐。CPU是延迟敏感型架构,它的核心数量少,通常每核只同时处理一到两个线程,一旦当前线程发生缓存未命中,就基本没有别的活儿可干,只能死等。为了不让等待白白消耗周期,CPU就必须把缓存做得又大又深,让命中率尽量高,把“掉回内存”的概率降到最低。说得直白些,CPU用缓存把数据“喂”到核心嘴边,尽量榨出单线程性能。

GPU则完全相反,它是吞吐量优先架构。一个SM里同时驻留着几十个线程束,当其中一个线程束访问显存而等待结果时,硬件会立刻切换到另一个线程束继续执行指令,切换过程既不需要保存恢复现场,也不需要刷新流水线,几乎是零开销的。这种用大规模线程并发来“掩盖”内存延迟的思路,使得“单一等待”不再致命。GPU并不指望L1、L2的命中率把单个线程喂饱,而是依靠足够多的线程塞满所有计算流水线,让存储系统的带宽持续满负荷跑动。

所以从需求根上GPU就没有“非得到L3不可”的动机。对GPU来说,缓存命中了固然是赚到,未命中也没关系,调度器只要切到另一个线程束就又能干活,等待期间整个芯片不会闲着。三级缓存的核心价值在于“为单线程降低等待时间”,而GPU不为单个线程服务,它服务的是整个芯片的吞吐总量,自然不需要为单点延迟把缓存层级砌到那么深。

3.2 局部性假设撑不起那么大的缓存

缓存能生效,前提是访问具备时间局部性和空间局部性。CPU上跑的是操作系统、数据库、编译器等通用程序,这些程序天然地在一个线程内反复访问同一批地址段,循环体、栈帧、函数调用都表现出极强的局部性。哪怕L3很大,也总能从里面捞到不少有用的数据。

GPU面对的却是大规模并行数据流,通常一个线程只处理一小块数据,然后进入下一个任务;相邻线程访问的是相邻的大块连续地址。这种流式访问模式对整个缓存体系并不友好,尤其不适合再往上层放一个巨型L3。真把一个几十MB的三级缓存扔进GPU,你会发现除了一部分重复读写的热点数据之外,大量流经它的数据只有一次访问,根本没有被复用的机会,L3占用的大面积SRAM就成了无效投资。

GPU实际上也会做局部性优化,但它选择的路线是“专门化缓存”,而不是“加一级缓存”。纹理访问有纹理缓存,常量访问有常量缓存,这些专用结构针对特定访问模式做了精细优化,命中率很可观,远比一个泛泛的大L3划算。真正能被多个SM共享的全局性数据,在L2这一层就已足够完成汇聚,没必要再加一级更高层次的缓存去承接流式访问。

3.3 面积预算的账:晶体管要用在刀刃上

芯片面积是硬约束,缓存本质上是纯SRAM晶体管堆砌,价格昂贵。CPU设计一个核只需要少量ALU和复杂控制逻辑,控制逻辑本身已经非常庞大,但算下来芯片上还有很多空白区域,这些区域用缓存填满是最划算的,因为缓存能直接拉高入门级应用的IPC。所以我们在CPU上看到L3动不动就是几十MB,它实际上是在“用面积换性能”。

GPU则把几乎每一平方毫米的面积都看成是并行计算单元的地盘。一个GPU要放进成百上千个计算单元、海量的寄存器堆、线程调度器和各种专用加速模块,这些部分都在争面积。如果在GPU里再塞一个L3缓存池,唯一的来源只能是削减计算单元数量、削减寄存器堆或者某部分专用单元。计算单元变少,意味着芯片的吞吐量直接掉价,这跟GPU的立身之本背道而驰。

有人会抬杠说:GPU的显存延迟那么高,难道不该多加缓存吗?但GPU的回应方式是投资更高的带宽:用HBM这类高带宽显存把吞吐拉满,让成千上万个并发线程一次性就能拉到海量数据,而不是依赖命中率来换取低延迟。你还会发现GPU特别肯在寄存器堆上花钱,一层的寄存器堆容量甚至能比整个L1还大不少,因为每个线程的变量都需要存放在寄存器堆里,它才是GPU真正的“第一级缓存”。

3.4 缓存一致性这颗深水雷

CPU多核之间需要极其严格的数据一致性,一个核写了变量,其他核立刻要看到正确的值,否则并发程序会全线崩溃。芯片设计上通常用MESI这类协议来追踪缓存行的状态,跨核心监听总线的请求,哪条cache line在哪个核手里,是独占还是共享,都要有精确记录。L3在这个协议中充当天然的消息集散地,所有请求都归拢到这一层去统一仲裁,避免每个核互相监听导致指数爆炸的复杂度。

GPU使用的则是弱一致性模型:正常计算过程中,各SM的L1之间并不同步数据,只有遇到内存屏障或者执行到全局同步点时,才把需要的数据刷到L2、让所有SM重新可见。这样做极大地减轻了硬件的一致负担,不需要在每一级缓存都做监听与目录。GPU更关心的是把读写合并和原子操作的粒度做好,L2承担全局协调点即可,根本不需要额外的L3再去做一次共享状态的追踪。非要去建L3,不仅性能没有明显收益,还会让跨SM数据可见性的时序模型更复杂,写起驱动来也更痛苦。

4. 从应用场景看这层设计取舍

4.1 同是浮点计算,两者的脾气完全不同

同样跑一批浮点运算,CPU和GPU会展现出截然不同的面貌。CPU上跑一个科学计算程序,一个人口稀少但身手敏捷的“通才团队”,每个核心有强大的乱序执行和巨大缓存,适合处理逻辑复杂、依赖性强、数据量中等的任务。哪怕遇到分支和跳转,它也能靠深度流水线硬扛下来。

GPU则像一个规模惊人的“极速流水线车间”,每个工人只做非常简单的事情,但胜在人多,而且换手快。每条线程可能只负责两个像素、几行矩阵、几十个神经元乘加,不需要复杂分支判断。数据从显存流水一般地流进计算单元,算完立刻输出,流水线被喂得越饱,吞吐量越高。为了接纳这种源源不断的输入,GPU的缓存只需在入口处做局部缓冲和聚合,没必要把整条流水线的上下数据都堆进三级层次。

4.2 什么场景会逼GPU“重走CPU老路”

有两类任务确实会逼着GPU出现更靠近CPU风格的缓存行为。第一类是光栅化后的渲染管线与光线追踪加速结构遍历,尤其是光线追踪中的BVH遍历,访问模式是不规则随机访问,并且依赖层次化跳转,跟CPU风格的数据结构遍历很接近,局部性比流式计算差很多。针对这个痛点,硬件设计师没有简单地在GPU里加一个L3,而是增加专用的遍历单元、更智能的缓存逻辑、甚至为BVH盒数据单独设计更细粒度的缓存策略。

第二类是越来越大的Transformer模型推理,它们当中有一部分矩阵向量乘的算子在处理批量小、序列长的场景时,会频繁读取大量权重数据,L2命中率对性能影响很敏感。实际厂商的做法也不是去新建一个L3层级,而是把L2容量做大、把数据切片调度做得更细,同时把算子融合到寄存器级别,让数据尽量在寄存器堆和共享内存里多周转。这条路依然沿着GPU“高带宽、多并发、浅缓存”的核心哲学走,并不打算推翻现有架构。

理解这一点对做性能工程特别有用:在CPU上优化,你会想尽办法提高缓存行命中率、减少伪共享、调整数据布局;在GPU上优化,反而要先考虑合并访问、占用率、寄存器压力,让带宽被充分压榨,而不是死磕一两个缓存的命中率。拿CPU的思路去调GPU,越调越别扭。

5. 常见疑问与容易搞混的点

5.1 GPU的L2命中率不高,是不是说缓存没用

在纯流式计算里,GPU L2的命中率确实不会像CPU那样高,但“命中率低”并不等于“缓存白做了”。L2的存在让多个SM的访问在这里被合并排序,对显存的压力做削峰填谷,同时对跨SM共享的原子变量和小范围热点数据提供汇聚点。GPU程序里的归约、排序、不规则访问,恰恰要依赖L2的加速。把L2看成一个“全局吞吐的协调器”而不是“高命中率的私有宝箱”,才更符合真实工作模式。

而且现代GPU的L2还会在驱动层参与精细调优,例如内存访问的自动聚合、压缩数据的解码缓冲、分层存储的迁移控制等。这些作用很难用简单的命中率数字来度量,但少了它芯片功耗和显存压力都会明显恶化。

5.2 GPU未来会不会真的加L3

我自己观察这几年主流GPU架构演进,L2在持续变大,某些旗舰产品已经把L2做成了类似“巨型中心缓存”的角色,容量达到十几甚至几十MB。可见大缓存对整个GPU是有价值的,但价值点在“共享数据交汇”和“减少显存颗粒的功耗浪费”,而不是为了给单个线程降低延迟。这仍然是在二级缓存的框架里做厚做强,而不是推出一个新层级。

未来的芯片封装走向chiplet时,跨die之间的互连可能被一些人称作“L3”,但那些互连高速缓存主要解决的是多模块之间的协议开销和数据传输,跟CPU意义上的“多核共享一致性缓存”并不是同一回事。更可惜的是,增加L3还会引入额外的功耗墙和设计验证周期,对GPU这种每代都以算力密度为王的芯片来说,短期看不到明显回报。

5.3 CPU和GPU的路线之争正在互相融合

虽然两者走的路不同,但这些年CPU和GPU确实在互相借鉴。CPU学会了SMT并发线程,在核心内部开出多个硬件线程来利用原本浪费的周期;GPU则在L2层做更细致的一致性逻辑、更聪明的访问聚合。中心思想都是同一个物理铁律:内存延迟不可能无限缩小,要么用缓存减少访问,要么用并发掩盖延迟。只是CPU把筹码更多押在缓存,GPU押在并发。

我入行这些年一个特别深的感触是:不要拿CPU缓存优化的习惯去套GPU,也不要见了GPU的“大L2”就觉得可以照搬CPU的三级缓存管理策略。理解了架构的动机,你才知道某个参数为什么定成这样,也才谈得上真正的底层调优。这问题看着小,答好它,你离真正读懂芯片设计就不远了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询