【问题标题】:Can an inner level of cache be write back inside an inclusive outer-level cache?内层高速缓存是否可以写回包含在内的外层高速缓存中?
【发布时间】:2019-12-23 04:05:11
【问题描述】:

我也问过类似的问题:Can a lower level cache have higher associativity and still hold inclusion?

假设我们有 2 级缓存。 (L1离CPU(内层/下层)最近,L2在CPU外,离主存最近)L1缓存可以写回吗?

我的尝试)
我认为我们必须只有通过缓存写入,并且我们不能在 L1 中有回写缓存。如果在 L1 缓存中替换了一个块,则必须将其写回 L2 以及主内存以保持包含。因此,它必须是直写而不是回写。

所有这些疑问都来自以下考试问题。 :P

问题)为了包含在两个缓存级别 L1 和 L2 之间 多级缓存层次结构 下列哪一项是必要的?

I) L1 必须是直写式缓存
II) L2 必须是直写式缓存
III) L2 的关联性必须大于 L1
IV) L2 缓存必须至少与 L1 缓存一样大

A) 仅 IV
B) 仅限 I 和 IV
C) 仅限 I、II 和 IV
D) I、II、III 和 IV

根据我的理解,答案必须是选项(B)

【问题讨论】:

    标签: caching memory memory-management cpu-architecture cpu-cache


    【解决方案1】:

    现实生活中的反例:英特尔 i7 系列(从 Nehalem 开始)有一个大的共享(内核之间)L3,它是包容性的。并且所有级别都是回写的(包括每核私有 L2 和 L1d),以减少外部缓存的带宽需求。

    Inclusive 只是意味着对于任何内部缓存中处于有效状态的每一行,外部缓存标记都具有除 Invalid 之外的状态。不一定数据也保持同步。 https://en.wikipedia.org/wiki/Cache_inclusion_policy 称其为“值包含”,是的,它确实需要直写(或只读)内部缓存。这就是选项 B,甚至比“包容”还要强大。

    我对常规包含的理解,特别是在英特尔 i7 中,数据可能是陈旧的,但 标签 始终是包含的。此外,由于这是一个多核 CPU,L3 标签会告诉您哪个 内核的私有 L2/L1d 缓存拥有处于 Exclusive 或 Modified 状态的行(如果有)。因此,如果另一个内核想要读取或写入该行,您就知道该与哪一个对话。即,它充当那些多核 CPU 的窥探过滤器。

    相反,如果在包含的 L3 缓存中没有标记匹配,则该行肯定不会出现在芯片上的任何位置。 (因此不需要将无效消息传递给每个内核。)有关更多详细信息,另请参阅Which cache mapping technique is used in intel core i7 processor?

    要写入一行,内部缓存必须通过外部缓存获取/RFO,因此它有机会在处理 L1d/L2 写入未命中(不是处于独占或修改状态)。

    显然这称为“包含标签”;该术语可能具有其他一些技术含义。我想我看到它被使用并且对它的含义做出了错误的(?)假设。 What is tag-only forced cache inclusion called? 建议“包含标签”并不意味着标签,但也没有数据。


    在内部缓存 (L1) 中有一条处于修改状态的行意味着包含性外部缓存将具有该行的标记匹配,即使外部缓存中的实际数据是陈旧的。 (我不确定这种情况下通常使用什么状态缓存;根据 cmets 中的@Hadi,它不是无效的。我认为它也不是共享的,因为它需要避免使用这些陈旧数据来满足来自其他核心的读取请求。)

    当数据最终从 L1 写回时,它只能在外部缓存中处于 Modified 状态,从 L1 中逐出。

    【讨论】:

    • 为了补充彼得的答案,在多核中使用多级包含缓存,每个缓存行的一致性状态(这确实与彼得提到的标签一起保存)被增强,以使 L2 了解正确的数据位置(添加一个名为 shared-to-L1 等的状态)。
    • 如果一行在 L1 中处于 Modified 状态,它在包含 L2 中仍将处于有效状态,因为在 L2 中为它分配了空间。在这种情况下,L2 中的行将是stale。无效意味着缓存条目为空,可用于放置新行。 Nehalem 中的 L3 确实是完全包容的,而不仅仅是标签包容。包含标签的缓存的一个示例是 Skylake-SP 中的 L3。
    • @HadiBrais:我不熟悉这方面的正式术语。显然,L2 需要一种方法来跟踪它是有效但陈旧的事实。我假设我们会将其与 Invalid 组合在一起,因为它无法满足读取请求,但我可以看到另一种方式的意义:该状态需要从内部缓存中逐出才能被替换。那么我们究竟如何称呼这种状态呢?有效但陈旧?
    • @HadiBrais:Multi-level cache for which inclusion holds 表示 L1 缓存必须是直写的,L2 才能具有包容性。如果没有,L1 可以保存不在 L2 中的数据。这对我来说很有意义。人们使用不同的约定/定义吗?你说 Nehalem L3 是完全包容的,而不仅仅是标签包容。另外,也许你可以回答What is tag-only forced cache inclusion called?
    • 啊,现在我明白你所说的包含标签的意思了。我以为您指的是答案中的单独窥探过滤器。实际上我以前没有见过这个词;它只是称为包容性缓存。您要查找的术语是“包含目录”。请参阅题为“NCID:用于灵活高效的缓存层次结构的非包容性缓存、包容性目录架构”的英特尔论文。关于您最后的评论,我想您可能会发现我的blog post 有帮助。
    【解决方案2】:

    您的问题的答案是 1V) L2 只需更大。即选项A

    包含仅表示 L1 中的行需要出现在 L2 中。该行可以在 L1 中进一步修改,L1 中的状态将反映相同。 当其他内核查找 L2 时,它可以 Snoop L1 中的线路状态,并在需要时强制进行 WB。

    【讨论】:

    • 你的意思是说只有陈述(IV)是真的?所以选项A是正确的。 :)
    • 这四个属性中没有一个是真正需要包含的。但是,如果没有属性 IV,使 L2 包含 L1 是没有意义的,因为 L1 永远无法充分利用。我认为该问题的预期含义是“为了使包含有用……”但是还需要其他属性:(1)系统中还有其他连贯的代理可以从具有包容性 L2 中受益,并且( 2) L2 关联性需要至少与 L1 一样大。总之,这个问题写得不好。无论如何,这是一个赞成票。
    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多