我读过分裂设计与this线程中缓存的统一设计的利弊。
基于我的理解,拆分设计的主要优点是:分离设计使我们能够将指令缓存放置在指令获取单元附近,数据缓存靠近存储单元,从而同时减少两者的延迟。而的主要缺点是:指令和数据缓存的结合空间可能无法得到有效利用。仿真结果表明,相同大小的统一缓存具有较高的命中率。
然而,对于“为什么(至少在大多数现代处理器中) L1缓存遵循拆分设计,而L2/L3缓存遵循统一设计”这个问题,我却找不到直观的答案。
发布于 2020-10-03 13:07:07
拆分L1的主要原因是在两个缓存之间分发必要的读/写端口(以及带宽),并将它们物理地放置在数据加载/存储和指令获取部分附近。
L1d还可以处理字节加载/存储(在某些ISAs上,未对齐的更宽的负载/存储)。在x86 CPU上,如果想要handle that with maximum efficiency (而不是包含单词的RMW ),英特尔的L1d只能使用奇偶校验,而不是ECC。L1i只需要处理固定宽度的取取,通常是一些简单的东西,比如对齐的16字节块,而且它总是“干净”的,因为它是只读的,所以它只需要检测错误(不正确),并且只需要重取。因此,它可以减少每一行数据的开销,比如每8或16字节只有一对奇偶校验位。
请参阅Why is the size of L1 cache smaller than that of the L2 cache in most of the processors? re:不可能构建一个容量为L1i/d.的两倍容量、相同延迟和带宽总和的大型统一L1缓存(由于读写端口的大小和数量,的功耗至少要高得多,但由于物理距离的原因,延迟可能是不可能的)。
这些因素对L2都不重要(或者在未对齐/字节存储的情况下根本不存在)。总容量,可用于代码或数据是最有用的,有竞争力地分享根据需求。
对于任何工作负载来说,在同一个时钟周期中有大量的L1i和L1d遗漏是非常罕见的,因为频繁的代码丢失意味着前端停止,后端将耗尽加载/存储指令来执行。(频繁的L1i缺失是罕见的,但是频繁的L1d缺失确实发生在一些正常的工作负载中,例如遍历不适合L1d的数组、大型哈希表或其他更分散的访问模式。)无论如何,这意味着在正常情况下,数据可以获得全部L2带宽预算的大部分,而统一的L2仍然只需要一个读取端口。
@Hadi的答案,你所链接的,确实涵盖了大部分这些原因,但我想写一个简化的/摘要的答案并没有什么坏处。
https://stackoverflow.com/questions/64184265
复制相似问题