内层的缓存可以写回到包含它的外层缓存吗?

3

我曾经提出过类似的问题:低一级缓存可以具有更高关联性并仍然保持包容性吗?

假设我们有2级缓存。(L1是最靠近CPU(内部/低级)的,而L2在其外面,最靠近主内存),那么L1缓存可以采用写回(write back)吗?

我的尝试)
我认为我们必须只采用写通(write through)缓存,并且不能在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)

2个回答

8
实际反例:英特尔i7系列(自Nehalem以来)具有大型共享(在核心之间)的L3缓存,而且所有级别都是写回(包括每个核心的私有L2和L1d),以减少外部缓存的带宽需求。
“包容性”只是指外部缓存标记对于任何内部缓存中处于有效状态的行都具有除“无效”以外的状态。这并不一定意味着数据也保持同步。“https://en.wikipedia.org/wiki/Cache_inclusion_policy将其称为“值包含”,确实需要一个写通(或只读)的内部缓存。这是选项B,并且比“包容性”更强。
我对Intel i7中常规包容性的理解是,数据可能过时,但标记始终是包容性的。此外,由于这是一个多核CPU,L3标记告诉您哪个核心的私有L2 / L1d缓存拥有独占或修改状态的行(如果有)。因此,如果另一个核心想要读取或写入该行,则知道要与哪个核心通信。也就是说,它作为多核CPU的嗅探过滤器工作。
相反地,如果包含L3缓存中没有标签匹配,则该行绝对不存在于芯片上。(因此无需将失效消息传递给每个核心。)有关更多详细信息,请参见 Intel Core i7处理器使用哪种高速缓存映射技术? 为了写入一行,内部缓存必须通过外部缓存获取/ RFO,因此它有机会以这种方式保持包含性,因为它处理来自L1d / L2写入未命中的RFO(读取所有权)(不在独占或修改状态)。
显然,这并非称为“标记包容性”;该术语可能具有其他技术含义。我认为我看到它被使用,并对它的含义做出了错误的(?)假设。强制标记缓存包含的是什么?表明“标记包容性”不仅意味着标记,也不意味着数据。
在内部缓存(L1)中有一条处于修改状态的线路意味着具有包容性的外部缓存将为该线路匹配标签,即使外部缓存中实际数据已经过时。(我不确定缓存通常用什么状态来处理这种情况;根据@Hadi在评论中的说法,它不是无效状态。我认为它也不是共享状态,因为它需要避免使用这些过时的数据来满足其他核心的读请求。)
当数据最终从L1写回时,它只能在外部缓存中处于修改状态,并从L1中逐出。

1
补充Peter的回答,对于多核心中的多级包容性缓存,每个缓存行的一致性状态(正如Peter所提到的那样,这确实是通过标记来保持的)被增强以使L2知道数据的正确位置(添加一个称为shared-to-L1等的状态)。 - instinct71
如果在L1中的一行处于已修改状态,那么由于L2中为其分配了空间,该行仍然会处于有效状态。在这种情况下,L2中的行将会变得陈旧。无效表示缓存条目为空,可以用来放置新的行。在Nehalem中,L3是真正的全包含,而不仅仅是标记包含。标记包含高速缓存的一个例子是Skylake-SP中的L3。 - Hadi Brais
@HadiBrais:我不熟悉这个问题的正式术语。 明显,L2需要一种跟踪其有效但陈旧的状态的方法。 我认为我们会将其与无效状态分组,因为它不能满足读请求,但我可以看出另一种方式也有道理:该状态需要从内部缓存中清除才能被替换。 那么我们到底应该称呼那个状态?有效但陈旧的状态? - Peter Cordes
关于您的第一个评论,无论一致性协议是什么(例如MSI),在包容性缓存中,M或S任何一种都可能过时。没有明确的状态来表示“过时”,这并不是必需的。它更像是编码在协议实现中的。关于您的第二个评论,写穿并不是包容性所必需的。包容性只意味着如果一行在任何状态(除了无效)下存在于缓存中,则它必须以某种状态(除了无效)存在于包容性缓存中。那是包容性的唯一正确定义。 - Hadi Brais
1
啊,现在我明白你所说的“标签包容”的意思了。我原以为你是指你回答中的单独窥探过滤器。实际上,我之前从未见过这个术语;它只被称为包容式高速缓存。你要找的术语是“包容式目录”。请参阅英特尔论文《NCID: A non-inclusive cache, inclusive directory architecture for flexible and efficient cache hierarchies》。关于你最后的评论,我认为你可能会发现我的博客文章有帮助。 - Hadi Brais
显示剩余5条评论

1
你的问题的答案将是1V),只需要L2更大。即选项A。
包容性仅意味着L1中的行需要存在于L2中。该行可能会在L1中进一步修改,而L1中的状态将反映相同的状态。 当其他核心查找L2时,它可以窥视L1中行的状态,并在需要时强制进行WB。

你的意思是只有语句(IV)是正确的吗?那么选项A就是正确的。 :) - rohith
这四个属性都不是必需的,以便包含成立。然而,如果没有属性IV,则使L2包含L1就没有意义,因为L1永远无法完全利用。我认为问题的预期含义是“为了有用的包含……”但是其他属性也是必需的:(1)系统中还有其他连贯的代理人会从具有包容性的L2中受益,(2)L2关联性至少与L1一样大。总之,这个问题写得很糟糕。无论如何,这里有一个赞。 - Hadi Brais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接