
组装电脑CPU缓存到底是什么?以及如何区分不同型号之间的性能上的差异
关于CPU缓存这件事,很多人在装机的时候只知道看“三级缓存”那个数字,觉得大了好、小了不好,但要问缓存到底是干什么的、大了好在哪、对游戏和办公有什么实际影响,能说清楚的人就不多了。这篇文章专门来讲缓存——从缓存到底是什么、它怎么影响电脑的表现,到不同型号之间缓存参数怎么比较、装机时该怎么取舍。
一、缓存到底是什么东西——先把这个概念讲清楚
缓存是CPU内部的高速暂存区。它的作用说白了就是一个缓冲层:CPU干活要用数据,缓存提前把这些数据从慢得多的内存里搬到自己身上,等CPU需要的时候伸手就能拿到,不需要每次去远的地方取。
为了理解缓存为什么重要,可以先看拿数据要花多长时间。
现代CPU内部的时钟周期大约一秒钟要跑几十亿个周期。CPU从不同地方拿数据,消耗的时间用“时钟周期”来折算一目了然。按照当前主流处理器的典型数值,一级缓存(L1)的访问延迟大约是1到3个时钟周期,也就是说L1几乎跟CPU本身的运算节奏同步-1。二级缓存(L2)的延迟大约是10到20个周期,稍微慢一点但依然很快-1。等到了三级缓存(L3),访问延迟变成了30到50个周期-1。一旦缓存没命中、必须去主内存里找数据,那等待时间就直接跳到200个时钟周期以上——这是灾难级别的等待-1。
这四个数字放在一起,结论就很直观了:尽量让数据留在缓存里,尤其是L1和L2,CPU才能跑得飞快。
1.1 多级缓存的物理结构和协作机制
CPU内部有三层缓存结构。
一级缓存分为两块:L1指令缓存负责存放CPU接下来要执行的指令,L1数据缓存负责存放指令需要处理的数据。这种把指令和数据分开的设计叫哈佛结构,好处是指令预取和数据访问可以同时进行,不互相排队,流水线不容易停顿。
一级缓存的容量非常小,通常在16KB到64KB之间,因为它追求的是速度快到跟CPU核心完全同步,延迟只要1到3个周期-1。一级缓存命中率通常能到百分之九十二以上,就是说CPU绝大部分时候都能在贴身口袋里找到需要的东西。
二级缓存是每核心独享的,容量在512KB到4MB之间,延迟大约10到20个周期-1。当一级缓存没有命中时,请求会向二级缓存发出。二级缓存的容量是一级的好几倍,但速度慢了一些,这种设计本质上是一个折中:如果缓存容量做成一级那么大就等于没给一级留出“上菜”的时间窗口,如果做到三级那么慢又失去缓冲层的意义。
三级缓存则是多核心之间共享的一整块大容量缓存,容量从目前的30MB到208MB不等。它的定位是“所有人的共同仓库”。比如多个核心都在处理同一个大型游戏的同一批场景数据,三级缓存里存一份,大家都能直接看到,不需要让每个核心各自去内存里搬一次。三级缓存的访问延迟大约在30到50个周期-1。
核心与核心通过一条环形总线连接到三级缓存上。AMD的全大核架构里,所有核心的三级缓存延迟是均匀的。Intel的混合架构里,P核和E核共享同一组L3——这在Arrow Lake上是第一次做到,之前的架构E核是没有L3可用的-18。
1.2 缓存如命中和失效——局部性原理的两种形态
缓存能起作用,基础是程序运行时的局部性原理。这种局部性体现在两个方面:时间局部性和空间局部性。
时间局部性是指一个内存地址刚被读过,短时间内CPU有很大概率再读它一次。比如游戏中AI状态的计算会反复访问同一个小块数据。
空间局部性是指一个内存地址被读取后,它地址附近的数据也极有可能被立刻用到。比如游戏中一大块纹理数据是连续排列的,读到第一个像素,周围上千个像素就直接跟着放进缓存里。
现代缓存的基本管理单位是缓存行,一个缓存行通常是64字节大。CPU每次访问内存时,从来不是按字节取数据,而是一次拉一整个缓存行。内存整行返回后,一级放一份、二级放一份、三级放一份,全部存着-1。CPU直接从一级读,读完之后如果需要还可以直接再读一个完整缓存行的数据,三级映射机制保证数据查找高效且上下级之间查找不重复。
缓存未命中是一段程序性能最本质的杀手。当一级缓存不包含所需数据,就产生一次未命中。未命中后查询二级,如果二级还没有,再去三级。连三级缓存都没有,就只能向主存发起请求——主存延迟两百个周期以上,期间处理器核心等于白等至少两百个周期不执行有效指令。这种连锁等待会直接拖拉任何用到这些数据的程序线。
二、CPU内部缓存的运作方式和关键技术
2.1 多级包含的存储层级
CPU的缓存访存模型是一级比一级容量大、一级比一级延迟长。在运行一道程序时,CPU读取数据永远不会直接访问内存,而是永远只跟一级缓存要数据。一级缓存里没有就去问二级缓存;二级缓存里没有就去问三级缓存;三级缓存里还没有,就去主内存里取。