这是有不同原因的。
L2存在于系统中,以加快当L1缓存未命中的情况。如果L1的大小与L2相同或更大,则L2将无法容纳比L1更多的缓存行,并且无法处理L1缓存未命中。从设计/成本角度来看,L1缓存与处理器绑定,比L2更快。缓存的整个思想是通过添加比最慢的硬件性能更高(并昂贵)但比您拥有的更快的硬件便宜的中间硬件来加速访问较慢的硬件。即使您决定将L1缓存加倍,也会增加L2以加速L1缓存未命中。
那么为什么还需要L2缓存呢?好吧,L1缓存通常更具性能和建造成本更高,并且它绑定到单个核心。这意味着,将L1大小增加固定数量将导致在双核处理器中将该成本乘以4,或者在四核处理器中将其乘以8。 L2通常由不同的内核共享--根据体系结构可以在处理器中的一对或所有内核之间共享,因此即使L1和L2的价格相同--这是不可能的,增加L2的成本也会更小。
L2的存在是为了加速L1缓存未命中的情况
比L2在系统中的存在是为了加速L1缓存未命中
更清晰。我认为加速缓存未命中
有点误导性。 - arunmoezhi@Aater的回答解释了一些基础知识。我将添加一些更多细节和实际缓存组织的示例,包括延迟和其他属性,而不仅仅是大小。
有关IvyBridge的一些详细信息,请参见{{link2:“缓存为什么这么快?”我的回答},其中讨论了整体负载使用延迟,包括地址计算时间以及不同缓存级别之间数据总线的宽度。
L1还使用速度技巧,如果它更大就行不通。即大多数设计使用虚拟索引,物理标记(VIPT) L1,但所有索引位都来自页面偏移以下,因此它们的行为类似于PIPT(因为虚拟地址的低位与物理地址相同)。这避免了同义词/同音词(误命中或相同数据在缓存中出现两次,请参见Paul Clayton在链接问题上的详细答案),但仍然允许部分命中/错过检查与TLB查找同时发生。VIVT高速缓存不必等待TLB,但必须在每次更改页面表时使其失效。
在x86架构中(使用4kiB虚拟内存页),32kiB 8路组相联L1缓存在现代设计中很常见。由于这些位于虚拟地址和物理地址下方的低12位是相同的(它们低于4kiB页面的页偏移量),因此可以基于虚拟地址的低12位获取8个标记。这种针对L1缓存的速度优化只有在它们足够小且关联度足够高以至于索引不依赖于TLB结果时才有效。32kiB / 64B行 / 8路组相联 = 64 (2^6) 组。因此,地址的最低6位选择线内的字节,并且接下来的6位索引了8个标记的一组。这组8个标记与TLB查找并行获取,因此可以与TLB结果的物理页面选择位并行检查这些标记,以确定缓存的8个路中哪些(如果有)包含数据。(PIPT L1缓存的最小关联度,也可作为VIPT访问,无需将索引转换为物理地址)缓存越大,清除它会造成的损失就越大,因此一个大的VIVT L1缓存将比当前的VIPT-that-works-like-PIPT更糟糕。而一个更大但延迟更高的L1D也很可能更差。
根据@PaulClayton的说法,L1缓存通常与标记一起并行获取集合中的所有数据,因此一旦检测到正确的标记,它们就已经准备好被选择了。这样做的功耗随关联度增加而增加,因此一个大的高关联度L1不仅面积大、延迟高,而且能耗也很高。(与L2和L3相比,它的面积不算很大,但物理位置对于延迟很重要。当时钟周期为1/4纳秒时,光速传播延迟很重要。)
较慢的缓存(例如L3)可以以更低的电压/时钟速度运行,以产生更少的热量。它们甚至可以使用每个存储单元的不同晶体管排列,以制作更适用于功耗而非高速的存储器。
多级缓存有很多与功耗相关的原因。在现代CPU设计中,功率/热量是最重要的约束之一,因为冷却小芯片很困难。在速度和功耗(和/或晶片面积)之间需要做出权衡。此外,许多CPU由电池供电或位于需要额外冷却的数据中心。
此外,我还写了一篇关于Intel Core i7处理器使用哪种高速缓存映射技术?的单独答案。
现代英特尔设计使用一个大型包容性L3缓存,由所有核心共享,作为高速缓存一致性流量的后备。它在物理上分布在各个核心之间,每个核心有2048组* 16路(2MiB)(IvyBridge及更高版本中采用自适应替换策略)。较低级别的缓存是每个核心专用的。另一个真实的例子:AMD Piledriver:(例如Opteron和桌面FX CPU)。缓存行大小仍然是64B,就像英特尔和AMD多年来一直使用的那样。文本主要摘自Agner Fog的微架构pdf,加上我找到的一些幻灯片的额外信息,更多关于写通L1 + 4k写组合高速缓存 在Agner的博客上,并且有一个评论说只有L1是WT,而不是L2。
cpuid
的叶子0x02
的描述,并注意到第二和第三级缓存没有任何数据/指令分离。所以所有当前的x86 CPU都有“统一”的第二和第三级缓存? - St.Antario1 当然,还有其他因素影响着权衡,例如面积和功耗,但在保持这些因素不变的情况下,大小和速度之间的权衡适用,并且即使这些因素没有保持不变,基本行为也是相同的。
2 除了这种压力外,像大多数L1设计一样,已知延迟缓存还具有调度优势:乱序调度器可以乐观地提交依赖于内存加载的操作,以便在L1缓存返回的周期上读取旁路网络的结果。这减少了争用,或许从关键路径上切掉了一个周期的延迟。这对最内层的缓存级别施加了一定的压力,要求其具有统一/可预测的延迟,可能会导致较少的缓存级别。
3 原则上,您可以在没有此限制的情况下使用VIPT高速缓存,但只能通过需要操作系统支持(例如页面颜色)或其他约束条件来实现。x86架构尚未做到这一点,现在可能无法开始。
对于那些对这类问题感兴趣的人,我的大学推荐阅读《计算机体系结构:量化研究方法》和《计算机组成与设计:硬件/软件接口》。当然,如果你没有时间阅读这些书籍,可以在维基百科上快速浏览相关内容。
从逻辑上讲,这个问题的答案已经很明显了。
如果L1比L2(合并后)更大,那么就不需要L2缓存了。
如果你可以把所有东西都存储在硬盘驱动器上,为什么还要把它们存储在磁带驱动器上呢?