2.6 数据缓存
从流水线角度看,指令缓存很重要,但它只占据了CPU晶体管资源的一小部分。数据缓存是CPU存储体系中的重要组成部分,而且其面积经常要占据CPU芯片总面积的一半甚至更多。Intel 8核心处理器如图2-11所示,可以看到仅多核心共享的L3缓存就占据了非常大的面积。缓存的快速发展是因为运算器要不断访问内存来维持计算持续性,内存永远是不够大的,且随着CPU频率的提升,内存也是不够快的,所以在内存和CPU之间构建一个缓冲层显得格外重要。
图2-11 Intel 8核心处理器
CPU的数据缓存体系相当复杂,我们将会从多级缓存的历史与意义,缓存的逻辑构成,缓存的组织方式,以及缓存的替换、写入策略、一致性等细节入手,讲述数据缓存的工作原理。
早期的80486处理器相当于把80386处理器、负责浮点计算的数学协处理器80387以及8KB的高速缓存集成到一起,这种片内高速缓存称为一级缓存。80486处理器还支持主板上的二级缓存,这仅有的8KB高速缓存同样是80486处理器的创举。当时的缓存设计为可以对频繁访问的指令和数据实现快速混合存放,使整个芯片的性能得到大幅度提升。缓存概念由此诞生,并一直延续到今天成为影响CPU性能的重要因素。
在缓存中的数据是内存中的一小部分(我们可以理解为CPU的缓存是内存的高速镜像),但这一小部分数据是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。由此可见,在CPU中加入缓存是一种高效的解决方案,这样整个内存储器(缓存+内存)就变成了既有缓存的高速度又有内存的大容量的存储系统了。
Intel于1993年推出了新一代高性能处理器Pentium(奔腾),Pentium将一级缓存增加到了16KB,这种改进大大提升了CPU的性能,使得Pentium的速度比80486的速度快数倍。总体来说,缓存的规模扩大是在“Pentium时代”,这已经成为业界对于CPU性能提升的重要共识,而缓存的大小也逐渐成为判断CPU性能的重要标准。Intel在推出Pentium之后,又瞄准高端市场,于1996年推出了Pentium Pro(高能奔腾)。Pentium Pro具有两大特色:一是封装了与CPU同频运行的256KB或512KB二级缓存;二是支持动态预测执行,可以打乱程序原有指令顺序。这两项改进使得Pentium Pro的性能有了质的飞跃。
Intel在产品Pentium Ⅱ上放弃了二级缓存的集成,运行速度也发生了不可避免的下降。Pentium Ⅱ使用一种插槽式设计,处理器芯片与其他相关芯片都放在一块类似子卡的电路板上,而Intel把L2缓存放在电路板上,只以处理器频率的一半运行,如图2-12所示。最后虽然该产品性能出现了少许损失,但是此举提高了处理器的良品率,从而降低了生产成本,获得市场好评。
图2-12 Pentium Ⅱ处理器
1997年4月,AMD推出K6-2处理器,虽然该处理器带有64KB的一级缓存,但是K6-2的二级缓存位于主板上,容量为512KB~2MB,只能与总线频率同步。不过随后的K6-3处理器带给我们诸多亮点,它带有一级缓存64KB,内置全速二级缓存256KB,创造性地外置512KB~2MB的三级缓存,其与系统总线频率同步。虽然K6微架构的浮点算力与P6微架构的Pentium系列产品有不小差距,二级缓存也没有完全集成在CPU内部,但其令人满意的性能和低廉的价格让Intel感到巨大的压力。在Pentium Ⅱ和K6-3之后,随着制程技术的进步,CPU设计者开始将二级缓存集成到CPU芯片中,从而提高其运行速度。此后CPU的二级缓存都是全速的,再也没有出现过芯片外的半速缓存,有的高端CPU甚至集成四级缓存。这样做的好处是可以减少从缓存读取数据的延迟时间,从而提高处理器的性能。