1

我正在阅读该线程中缓存的拆分设计与统一设计的优缺点。

根据我的理解,拆分设计的主要优点是:拆分设计使我们能够将指令缓存放置在靠近取指单元的位置,将数据高速缓存放置在靠近内存单元的位置,从而同时减少两者的延迟。主要缺点是:指令缓存和数据缓存的组合空间可能没有得到有效利用。模拟表明,总大小相同的统一缓存具有更高的命中率。

但是,对于“为什么(至少在大多数现代处理器中)L1 缓存遵循拆分设计,但 L2/L3 缓存遵循统一设计。)”这个问题我找不到直观的答案。

4

1 回答 1

2

拆分 L1 的大部分原因是在两个缓存之间分配必要的读/写端口(以及带宽),并将它们物理上靠近管道的数据加载/存储与指令获取部分。

L1d 也可以处理字节加载/存储(在某些 ISA 上,未对齐的更广泛的加载/存储)。在 x86 CPU 上想要以最大效率处理(不是包含单词的 RMW),英特尔的 L1d 可能只使用奇偶校验,而不是 ECC。L1i 只需要处理固定宽度的提取,通常是一些简单的东西,比如对齐的 16 字节块,它总是“干净”的,因为它是只读的,所以它只需要检测错误(不正确),然后重新提取. 因此它可以减少每行数据的开销,例如每 8 或 16 个字节只有几个奇偶校验位。

请参阅为什么 L1 缓存的大小在大多数处理器中都小于 L2 缓存的大小?回复:不可能构建一个具有两倍容量、相同延迟和总带宽的大型统一 L1 缓存作为拆分 L1i/d。 (由于读/写端口的大小和数量,至少在电力方面的成本高得令人望而却步,但由于物理距离的原因,延迟实际上可能是不可能的。)

这些因素对 L2 都不重要(或者在未对齐/字节存储的情况下根本不存在)。可用于代码或数据的总容量在那里最有用,可根据需求进行竞争共享。

对于任何工作负载来说,在同一个时钟周期内出现大量 L1iL1d 未命中的情况是非常罕见的,因为频繁的代码未命中意味着前端停止,而后端将耗尽加载/存储指令来执行。(频繁的 L1i 未命中很少见,但在某些正常工作负载中确实会发生频繁的 L1d 未命中,例如循环遍历不适合 L1d 的数组,或大型哈希表或其他更分散的访问模式。)无论如何,这意味着数据可以在正常情况下获得了 L2 总带宽预算的大部分,一个统一的 L2 仍然只需要 1 个读端口。

您链接的@Hadi 的答案确实涵盖了大多数这些原因,但我想写一个简化/摘要答案并没有什么坏处。

于 2020-10-03T13:07:07.697 回答