为什么Cache要分级?
前文(L1,L2,L3Cache究竟在哪里?)中我们提到CPU中有L1、L2、L3甚至L4级Cache。为什么搞这么麻烦,制程提高,可以放更多晶体管了,CPU厂商直接把L1和L2加倍不就好了吗?
要回答这个问题,首先我们要知道L1和L2Cache的区别,它们的构造一样吗?答案是否定的,虽然它们都是由CAM(ContentAddressableMemory)为主体的tag和SRAM组成的,但是区别却是明显的:L1(先不考虑指令和数据L1的不同)是为了更快的速度访问而优化过的,它用了更多/更复杂/更大的晶体管,从而更加昂贵和更加耗电;L2相对来说是为提供更大的容量优化的,用了更少/更简单的晶体管,从而相对便宜和省电。同样的道理还可以推广到L2和L3上。
在同一代制程中,单位面积可以放入晶体管的数目是确定的,这些晶体管如果都给L1则容量太少,Cache命中率(HitRate)严重降低,功耗上升太快;如果都给L2,容量大了但延迟提高了一个数量级:
如何平衡L1、L2和L3,用固定的晶体管数目达成最好的综合效果,这是一种平衡的艺术。在多年实践之后,现在已经相对固定下来,Intel和AMD的L1Cache命中率,现在往往高于95%,增加更多的L1效果不是很显著,现在更多的是增大L3,以达到花同样的代价,干更多的事的目的。
Cache为什么不会做的很大?
L3现在动辄数十M,比以往那是阔绰很多了,但相对摩尔定律增长的内存容量来说则大幅落后。为什么Cache增长这么缓慢?还是Cost的问题。一个最简单的SRAM就要消耗6个晶体管:
再加上Tag,最少需要数十个晶体管,代价很大。我们花这么大的代价增加Cache,衡量性能的命中率是如何变化的呢?
为简化起见,我们假设L1维持在不到60%的命中率(实际情况95%左右)。从图中可以看出,随着L2容量的增加,开始时L2和整体命中率快速提高,这表明提高L2容量效用很明显。随后L2的命中率在容量增加到64KB后增长趋缓,而整体命中率也同时趋缓,最后甚至基本不大变化了。增加同样的晶体管,而受益却越来越少,出现了边际效用递减的问题。
我们上文(Cache是怎么组织和工作的?)中不同的映射关系会不会使结果不同呢?
从这个图中我们看出不同的映射关系,从直接映射(1way-Associative)到16路,尽管明显16路更好,但是还是在size达到64KB左右,增加cachesize用处不大了。
如此说来,制程进化得来的多余晶体管,在做Cache效益不明显的前提下,还不如把它们拿来做个Core什么的,或者再多做一级Cache!这也是为什么Cache不再增加,而级数增加的原因了。目前我知道Cachesize占据Die面积最大的就数这款PentiumM的Die了:
注意左边都被L2Cache占据,右边还有些L1Cache,整体大于65%的Diesize被用于Cache。
一个脑洞
我们暂时放下讨厌的Cost和制程问题,假设我们有钱任性,做出一个A4纸一样大的L1cache,把我们尊贵的Core放在正中间,像这样:
我们的L1Cache可以做到1G,完全不要内存,我们会不会得到一个性能超赞的CPU呢?不幸的是,并不会。因为L1做的这么大,要在一个时钟域内(同步时钟设计远比异步简单)可以访问所有单元,时钟频率做不到很高,而Core因为要在一个周期内操作L1,也不得不放弃3G以上的身价,而大大降低频率。综合下来也许还不如一部分做L1,一部分做L2和L3。这样L1就可以频率很高,Core也不需要自贬身价了。这也从另一方面证明了Cache分级的必要性。
结论
Intel大约每过10年,就
标签: CPU、 设计、 硬件、 中央处理器、 CPU、本文地址: https://yihaiquanyi.com/article/c1d71151a11618bdeae7.html
上一篇:怎样知道我的车停在哪里怎样知道我的电脑是...