通过我们前面的系列文章,大家对Cache的组织形式和特性都有了一定的了解。有个问题不知道大家思考过没有:为什么Cache分这么多级,而是不是直接把L1或者L2增大了事?我们为什么不能直接做出个Cache奇大的CPU呢?下面我们来一一分析。
为什么Cache要分级?
![](http://studygolang.qiniudn.com/180102/9c80ca0f338ac13f96fc8be17e6ff9cf.png)
前文(L1,L2,L3 Cache究竟在哪里?)中我们提到CPU中有L1、L2、L3甚至L4级Cache。为什么搞这么麻烦,制程提高,可以放更多晶体管了,CPU厂商直接把L1和L2加倍不就好了吗?
要回答这个问题,首先我们要知道L1和L2 Cache的区别,它们的构造一样吗?答案是否定的,虽然它们都是由CAM(Content Addressable Memory )为主体的tag和SRAM组成的,但是区别却是明显的:L1(先不考虑指令和数据L1的不同)是为了更快的速度访问而优化过的,它用了更多/更复杂/更大的晶体管,从而更加昂贵和更加耗电;L2相对来说是为提供更大的容量优化的,用了更少/更简单的晶体管,从而相对便宜和省电。同样的道理还可以推广到L2和L3上。
在同一代制程中,单位面积可以放入晶体管的数目是确定的,这些晶体管如果都给L1则容量太少,Cache命中率(Hit Rate)严重降低,功耗上升太快;如果都给L2,容量大了但延迟提高了一个数量级:
如何平衡L1、L2和L3,用固定的晶体管数目达成最好的综合效果,这是一种平衡的艺术。在多年实践之后,现在已经相对固定下来,Intel和AMD的L1 Cache命中率,现在往往高于95%,增加更多的L1效果不是很显著,现在更多的是增大L3,以达到花同样的代价,干更多的事的目的。
Cache为什么不会做的很大?
![](http://studygolang.qiniudn.com/180102/9c80ca0f338ac13f96fc8be17e6ff9cf.png)
L3现在动辄数十M,比以往那是阔绰很多了,但相对摩尔定律增长的内存容量来说则大幅落后。为什么Cache增长这么缓慢?还是Cost的问题。一个最简单的SRAM就要消耗6个晶体管:
再加上Tag,最少需要数十个晶体管,代价很大。我们花这么大的代价增加Cache,衡量性能的命中率是如何变化的呢?
为简化起见,我们假设L1维持在不到60%的命中率(实际情况95%左右)。从图中可以看出,随着L2容量的增加,开始时L2和整体命中率快速提高,这表明提高L2容量效用很明显。随后L2的命中率在容量增加到64KB后增长趋缓,而整体命中率也同时趋缓,最后甚至基本不大变化了。增加同样的晶体管,而受益却越来越少,出现了边际效用递减的问题。
我们上文(Cache是怎么组织和工作的?)中不同的映射关系会不会使结果不同呢?
图片来源 ExtremTech
从这个图中我们看出不同的映射关系,从直接映射(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。
一个脑洞
![](http://studygolang.qiniudn.com/180102/9c80ca0f338ac13f96fc8be17e6ff9cf.png)
我们暂时放下讨厌的Cost和制程问题,假设我们有钱任性,做出一个A4纸一样大的L1 cache,把我们尊贵的Core放在正中间,像这样:
我们的L1 Cache可以做到1G,完全不要内存,我们会不会得到一个性能超赞的CPU呢?不幸的是,并不会。因为L1做的这么大,要在一个时钟域内(同步时钟设计远比异步简单)可以访问所有单元,时钟频率做不到很高,而Core因为要在一个周期内操作L1,也不得不放弃3G以上的身价,而大大降低频率。综合下来也许还不如一部分做L1,一部分做L2和L3。这样L1就可以频率很高,Core也不需要自贬身价了。这也从另一方面证明了Cache分级的必要性。
结论
![](http://studygolang.qiniudn.com/180102/9c80ca0f338ac13f96fc8be17e6ff9cf.png)
Intel大约每过10年,就会增加一级新的Cache。到现在已经有了L4的Cache。另一方面同样多的晶体管,到底是用来做Cache还是做更好的分支预测器,亦或更多的core,这也在考验设计师的能力。
下一篇将介绍CAM(Content Addressable Memory )为主体的tag以及它和SRAM的关系,敬请期待。
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)