roh*_*ith 3 memory caching memory-management cpu-architecture cpu-cache
我问过一个类似的问题:较低级别的缓存是否可以具有更高的关联性并且仍然包含包含?
假设我们有 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)
现实生活中的反例:英特尔 i7 系列(自 Nehalem 起)有一个包含在内的大型共享(内核之间)L3。并且所有级别都是回写(包括每核私有 L2 和 L1d)以减少外部缓存的带宽要求。
包含只是意味着对于任何内部缓存中处于有效状态的每一行,外部缓存标签都具有除 Invalid 之外的状态。不一定数据也保持同步。 https://en.wikipedia.org/wiki/Cache_inclusion_policy称其为“价值包含”,是的,它确实需要直写(或只读)内部缓存。那是选项 B,甚至比“包容性”还要强。
我对定期包含的理解,特别是在 Intel i7 中,数据可能是陈旧的,但标签总是包含的。此外,由于这是一个多核 CPU,L3 标签会告诉您哪个核心的私有 L2/L1d 缓存拥有处于 Exclusive 或 Modified 状态的行(如果有)。因此,如果另一个内核想要读取或写入该行,您就知道该与哪个内核对话。即它用作那些多核 CPU 的窥探过滤器。
相反,如果包含 L3 缓存中没有标签匹配,则该行肯定不会出现在芯片上的任何地方。(因此不需要将无效消息传递给每个内核。)另请参阅英特尔酷睿 i7 处理器中使用了哪种缓存映射技术?更多细节。
要写入一行,内部缓存必须通过外部缓存获取/RFO,因此它有机会在处理来自 L1d/L2 写入未命中(不是独占或修改状态)。
显然这不称为“包含标签”;该术语可能具有其他一些技术含义。我想我看到它被使用并且对它的含义做出了错误的(?)假设。 什么叫仅标记强制缓存包含?建议“包含标签”并不意味着标签,但也没有数据。
在内部缓存 (L1) 中拥有一条处于修改状态的行意味着包含性外部缓存将具有该行的标记匹配,即使外部缓存中的实际数据是陈旧的。(我不确定这种情况下通常使用什么状态缓存;根据@Hadi 在评论中的说法,它不是无效的。我认为它也不是共享的,因为它需要避免使用这些陈旧数据来满足来自其他内核的读取请求。)
当数据最终从 L1 写回时,它只能在外部缓存中处于修改状态,从 L1 逐出。