缓存一致性 - MESI 协议
Posted
技术标签:
【中文标题】缓存一致性 - MESI 协议【英文标题】:Cache coherence- MESI protocol 【发布时间】:2018-05-20 20:38:58 【问题描述】:在使用 MESI 协议(使用 l1 和 l2 包容性)的缓存中是否存在这样的情况,其中 l2 可以向 l1 中已经无效的行发送无效指令。
【问题讨论】:
【参考方案1】:“无效请求”,你的意思是?
我猜是这样,如果 L2 不根据它对 L1 的了解过滤它的请求,它可能只会在每次驱逐一行时向 L1 发送一个 INVD。不知道这对于真正的设计是否合理。 (从 L2 逐出可能是由硬件或软件预取到 L2 引起的,而不是响应 L1 回写。)
或者,如果 CPU 内核可以在 L2 发送无效的同时使 L1 中的一条线无效,则 INVD 可能在它已经使该线无效之后到达 L1。
【讨论】:
很好地抓住了场景一,错过了。只是想知道这是否是维护包容性财产的一部分。 @IsuruH:包容性是一种单向属性。较大的缓存包含内部缓存,但也包含内部缓存不包含的行。它必须是包含标签的,所以它总是知道内部缓存有什么,即使内部缓存有 M 状态,因此外部有 I。但是内部缓存应该能够随时删除一行。 (通常,例如在 x86 上运行clflush
或 NT 存储指令之后,我认为它也会将无效发送到外部缓存,但这需要时间并且为了保持包容性,L1D 必须删除 before 行它发送一个请求,要求 L2 这样做。)【参考方案2】:
可能存在这样一种情况,即 L2 根本不知道 L1 是否有线路,因为允许 L1 静默丢弃它。
事实上,如果 L2 是包容性的,那么在从 L1 驱逐未修改的线路(容量驱逐)时几乎没有任何理由浪费带宽,因为 L2 已经有一个副本并且没有任何更改。因此,L2 中的许多线路很可能在它们被从 L1 驱逐之后很长时间仍然存在。当它最终到达时(后来,因为它更大)从 L2 驱逐将不得不发送回一个窥探以强制执行包容性,因为它无法确定线路是否仍在 L1 中。
【讨论】:
以上是关于缓存一致性 - MESI 协议的主要内容,如果未能解决你的问题,请参考以下文章