【问题标题】:L1 caches usually have split design, but L2, L3 caches have unified design, why?L1缓存通常有分体设计,而L2、L3缓存有统一设计,为什么呢?
【发布时间】:2023-03-29 17:19:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: caching cpu-architecture cpu-cache micro-architecture


    【解决方案1】:

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

    L1d 也可以处理字节加载/存储(在某些 ISA 上,未对齐的更广泛的加载/存储)。在想要handle that with maximum efficiency(不是包含字的 RMW)的 x86 CPU 上,英特尔的 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? 回复:不可能构建一个具有两倍于拆分 L1i/d 的容量、相同延迟和总带宽的大型统一 L1 缓存。(至少由于读/写端口的大小和数量,电源成本高得令人望而却步,但由于物理距离的原因,延迟实际上可能是不可能的。)

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

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

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

    【讨论】:

    • 刚刚注意到这一点。好总结。但我正试图围绕字节加载/存储的部分。您当然可以设计一个支持无限制寻址的统一缓存。寻址 L1I 更简单。例如,在 Intel 处理器中,所有到指令字节缓冲区的取指都是 16 字节对齐的,因此 IFU 在查找 IFU 内存结构(L1I、牺牲缓存、ISB)时可以省略物理地址的最低 4 位。与统一设计相比,这会导致面积和功耗略小,但我不知道有谁认为这可以显着节省。
    • @HadiBrais:嗯,现在我想起来了,如果你确实有一个统一的缓存,其大小和读取端口的总数是两倍,那么指令读取读取端口可能仍然更简单。至少对于读取而言,处理 unaligned-within-line 的大部分工作是在每个读取端口存在一次的硬件中,而不是每行数据一次。对于写作,IDK 如果在寻址方面有很多节省。
    • @HadiBrais:但是关于 ECC 的要点是:如果您希望能够更新任何单个字节集合,则在不编写完整 ECC 颗粒时需要 word-RMW,或者您的 ECC 颗粒需要 1B(高开销),或者您只需要使用奇偶校验,就像传闻英特尔为 L1d 所做的那样。该成本与阵列大小成比例,因此将 L1 缓存的一半设为 I-cache 可以让这一半使用更高效的 ECC。也许您将其与其他字节/未对齐加载/存储机制分开。
    • 是的,它是有效的(我在回答中没有提到这一点)。数据访问次数通常远大于 L1I 访问次数,因此 L1D 可能需要 ECC 级别的保护,但奇偶校验对于 L1I 可能就足够了。使用统一设计,每个条目都需要 ECC,与拆分相比,显着增加了面积和功率开销(以及可能降低的性能)。您知道任何使用 ECC 用于 L1I 的真实处理器吗?我好像什么都不记得了。
    • L1D 很可能在大多数处理器中使用 ECC 而不是奇偶校验(不仅仅是来自英特尔的处理器)。我记得在 Linux 上与您讨论过一个工具,该工具显示了在每个缓存级别中使用了哪种错误检测技术(但我们不确定该工具从哪里获取数据)。我找不到讨论(我认为它在一些相关 Q/A 的评论部分)。无论如何,我记得报告 L1D 的 ECC 的工具,这很可能是正确的。
    猜你喜欢
    • 2020-05-19
    • 2011-04-11
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2017-03-10
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多