CPU设计-- 缓存 - 番外篇1 缓存的发展历史
CPU设计-- 缓存 - 番外篇1 缓存的发展历史
导读:CPU缓存是现代计算机硬件中的关键技术之一,它的发展历程见证了计算机性能的飞速提升。从早期CPU直接访问内存,到如今多级缓存架构的广泛应用,缓存技术在提高CPU效率方面发挥了重要作用。本文将带你了解CPU缓存技术的发展历程及其工作原理。
cache的发展历史
现在的CPU无一例外都具备多级缓存,那么为什么CPU需要缓存呢?其实很久以前,PC使用的处理器是没有缓存的。intel的早期产品4004/8008/80286上面都没有缓存设计的,因为此时CPU和内存的频率速度都很慢,速度都是同频率的,所以CPU直接访问内存就够了。例如,当时PC机采用8088CPU,系统主频为4.77MHz,一个基本总线周期为4拍,即840ns。此时64kB的DRAM存取周期200ns,造成DRAM等待CPU的执行的局面,无需Cache。
随着CPU频率的快速攀升,内存明显跟不上了——跟得上频率的内存价格突破天际。这样频率之间的落差让CPU和内存的沟通不再“同频”,缓存的作用越发重要。而且,内存容量的快速增长又带来了另一个问题:它需要更复杂的控制电路来寻址内存位置。说白一点,当乱序读取内存数据的时候,内存的响应时间将变得更不可测,显然这是CPU“等不起”的,CPU就只能浪费指令周期,进行无谓的等待。例如,在采用25MHz的80386DX时,一个基本总线周期为2拍,即80ns,当时已没有速度相匹配的DRAM可用。
从80386开始,这个CPU速度和内存速度不匹配问题已经开始展露,并且差距开始迅速扩大,慢速度的内存成为了计算机的瓶颈,无法充分发挥CPU的性能,为解决这个问题,Intel主板支持外部Cache,主板会提供一个64KB的缓存(甚至128KB)来“打辅助”,来配合80386运行。
intel在1989年发布的80486处理器80486将L1 Cache(大小8KB)放到CPU内部,同时支持外接Cache,即L2 Cache(大小从128KB到256KB),但是不分指令和数据Cache。80486内部Cache是一个4路组相联Cache。这些缓存设计显著提高了处理器的性能,相比于其前代产品,80486在执行速度和效率上有了很大提升。
等到Pentium-1/80586,也就是我们熟悉的奔腾系列,由于Pentium采用了双路执行的超标量结构,有2条并行整数流水线,需要对数据和指令进行双重的访问,为了使得这些访问互不干涉,于是L1 Cache被一分为二,分为指令Cache和数据Cache(大小都是8K),此时的L2 Cache还是在主板上,再后来Intel推出了Pentium Pro/80686,为了进一步提高性能L2 Cache被正式放到CPU内部。这种双路高速缓存结构减少了争用Cache所造成的冲突,提高了处理器效能。Pentium的Cache还采用了回写写入方式,这同486的贯穿写入方式相比,可以增加Cache的命中率。此外,还采用了一种称为MESI高速缓存一致性协议,为确保多处理器环境下的数据一致性提供了保证。
Pentium MMX是能运行多媒体指令MMX的高能奔腾处理器。Pentium MMX具有改进的分支预测和增强型流水线技术,并将L1 Cache容量增加到32kB,L2 Cache为512kB。
Pentium MMX的片内L1数据和指令的Cache,每个增到16kB,4路相联。较大的独立内部Cache、减少平均内存存取时间,同时提供对近期所用指令和数据的快速存取,性能因此得到提高。数据Cache支持采用回写方式更新内存。由于CacheL1容量的增大,使当时的应用程序运行速度提高了10%左右。
PentiumⅢ也是基于Pentium Pro结构为核心,在原有MMX多媒体指令的基础上,又增了70多条多媒体指令。它使用动态执行技术,采用双独立总线结构。PentiumⅢ具有32kB非锁定L1 Cache,L2可扩充到1~2MB,具有更合理的内存管理,可以有效地对大于L2缓存的数据块进行处理,使CPU、Cache和主存存取更趋合理,提高了系统整体性能。
2004年Intel在其服务器CPU至强系列中增加了4MB和2MB的L3 CACHE,尽管在后续数十年时间里,缓存的具体概念历经了几次变化,但整体架构在1990年代后期便趋于稳定。目前市面上常见的CPU Cache通常分为三级缓存:L1 Cache、L2 Cache、L3 Cache,级别越低的离CPU核心越近,访问速度也快,但是存储容量相对就会越小。其中,在多核心的CPU里,每个核心都有各自的L1/L2Cache,而L3 Cache是所有核心共享使用的。
目前市场上的高性能处理器核中的L1cache的组合一般为64KB Icache + 64KB Dcache,L2cache的大小一般由512KB、1MB、2MB,其中苹果的M1设置了16MB的L2cahche。
L3cache则由于多核的存在,目前可支持到1G的大小,大部分维持在128MB/256MB大小。
一般AMD的处理器相比Intel拥有更少的缓存,比如速龙64 X2 5000+缓存量为2X128KB+2X512KB=1.256MB,而定位在同档次的Intel奔腾E5200的缓存量只二级缓存就达到了2MB,目前广为人知的Intel的处理器性能相对更依赖缓存,1MB二级缓存的处理器要比同样架构的、具有2MB二级缓存的处理器性能差很多。
Cache为什么不会做的很大?
酷睿2系列处理器的二级缓存容量从1MB到2MB、3MB、4MB再到6MB、8MB、12MB可以说让人眼花缭乱,那么为何二级缓存到了12MB就没有再增加了呢?
虽然L1 Cache大小只有64KB,但其实对那时候CPU来说够用了,我们来看一副缓存命中率与L1、L2大小的关系图:
从上图我们可以发现,增大L1 cache对于CPU来说好处不太明显,缓存命中率并没有显著提升,成本还会更昂高,所以性价比不高。
而随着L2 cache 大小的增加,缓存总命中率会急剧上升,因此容量更大、速度较慢、更便宜的L2成为了更好的选择
目前主流的CPU中L1 cache的大小一般维持在32KB Icache + 32KB Dcache的组合上,
在Intel Sunny Cove(Core第10代),L1 cache从32K(指令)+32K(数据)的组合曾尝试过32K(指令)+48K(数据)的组合。这样的后果就是L1 cache的访问性能下降,从4个cycle变成5个cycle:
虽然只多了一个cycle,但相当于增加了25%的开销,实际上影响是不小的。Intel是知道这种延迟的代价的,Intel的希望是通过扩大L1 cache能获得的性能的提升抵消这种延迟。但这种一升一降的抵消是有上限的,增大L1 cache必然伴随着设计成本的增大,所以这里也有性价比的问题,也就是客户接受程度的问题,所以也是一个市场问题。
L3现在动辄数十M,比以往那是阔绰很多了,但相对摩尔定律增长的内存容量来说则大幅落后。为什么Cache增长这么缓慢?还是Cost的问题。一个最简单的SRAM就要消耗6个晶体管,再加上Tag,最少需要数十个晶体管,代价很大。我们花这么大的代价增加Cache,衡量性能的命中率是如何变化的呢?
为简化起见,我们假设L1维持在不到60%的命中率(实际情况95%左右)。从图中可以看出,随着L2容量的增加,开始时L2和整体命中率快速提高,这表明提高L2容量效用很明显。随后L2的命中率在容量增加到64KB后增长趋缓,而整体命中率也同时趋缓,最后甚至基本不大变化了。增加同样的晶体管,而受益却越来越少,出现了边际效用递减的问题。
我们上文(Cache是怎么组织和工作的?)中不同的映射关系会不会使结果不同呢?
从这个图中我们看出不同的映射关系,从直接映射(1 way-Associative)到16路,尽管明显16路更好,但是还是在size达到64KB左右,增加cache size用处不大了。
如此说来,制程进化得来的多余晶体管,在做Cache效益不明显的前提下,还不如把它们拿来做个Core什么的,或者再多做一级Cache!这也是为什么Cache不再增加,而级数增加的原因了。目前我知道Cache size占据Die面积最大的就数这款Pentium M的Die了:
注意左边都被L2 Cache占据,右边还有些L1 Cache,整体大于65%的Die size被用于Cache。
本文原文来自CSDN