【问题标题】:MESI protocol-How to handle INVALID?MESI协议-如何处理INVALID?
【发布时间】:2013-12-17 15:00:59
【问题描述】:
我正在尝试实现一个具有两级缓存(回写)的示例 MESI 缓存模拟器。我已将 MESI 状态位添加到两个缓存级别。由于它是回写式高速缓存,因此高速缓存行仅在刷新时才更新到 L2。我的疑惑是
从 L1 缓存中刷新具有无效状态的缓存行时应该是什么行为。它会忽略交易吗?似乎这是唯一的可能性..但似乎不对。
考虑处理器 1(P1) 修改处理器 2(P2) 共享的高速缓存行。然后 P2 中的缓存行将获得状态无效。如果 P2 将来必须更新相同的缓存行并且看到状态为无效,它应该从? /p>
当内核请求不在其缓存中的地址时,它会尝试从其他 L1 缓存中检索缓存行。如果在另一个缓存中发现是MODIFIED,是先在主存更新还是L2再取回?
是否所有的状态转换都是一次发生的?我的意思是当一个像队列一样进行时,所有其他缓存写入/读取是否都停止了?否则,有很多错误状态转换的机会。这不会造成巨大的瓶颈吗?
【问题讨论】:
标签:
java
multithreading
caching
processor
bus
【解决方案1】:
无效状态意味着那里没有缓存行,数据是垃圾数据,您可以忽略它。在稳定状态下(当缓存是热的),这可能会发生在某行被某些刷新指令强制退出,或被无效的监听命中(例如,另一个内核想要修改它)。
与上一节一样 - 一旦该行在 P1 中失效,它就不再存在。最近的数据不在 P2 中并且包括修改 - 该行将收到一个 M 状态,表明它由 P2 拥有并且是脏的。如果 P2 将来应该更新线路,它可能会在M 中点击它(如果它仍然存在)(这意味着它不能在其他任何地方,无需检查 P1),或者它可能已经驱逐了线路,将修改转移到 L2 或内存。到那时,该行可以在任何地方,因此需要从 L2 或内存中获取,如果可能存在,则在 P1 中进行侦听(如果您知道 P1 没有收到该行,大多数 CPU 会实施侦听过滤器以减少此侦听)自)。
这是一个设计决策 - 您可以选择直接“转移”M 状态,尽管这并不常见并且有一些注意事项。大多数 CPU 中的常见解决方案是将行写回共享 L2(在那里给它 M 状态,因为它仍然没有在内存中更新并且不能丢失),或者(如果 L2 不包含在内并且行不是t 在那里,并且您没有实现写入分配)-将其一直写入内存。无论哪种方式,请求核心都可以在该过程中接收更新的行。
请求通常被缓冲,因为您必须在处理它们时将它们保存在某个地方。但是,在等待来自内存的响应时,它们不必在队列中排序(它们确实需要排队以提交和解决排序问题和转发案例,但这由排序/执行逻辑处理,而不是作为缓存的一部分)。实际上,缓冲区允许您并行保持多个请求,并以先到先服务的方式等待数据,假设您的执行硬件可以处理(例如,如果您有一个乱序引擎),所以它远不是一个限制因素——瓶颈可能来自内存延迟或缺乏足够的缓冲区。
同时更新两行没有固有的问题(尽管如果您正在处理存储并且需要维护内存顺序(如顺序一致性或 TSO),则交换顺序很糟糕),但通常您有物理限制,例如读取端口或数据的数量总线,这将允许您在一定程度上对缓存进行多次访问,并且只有在缓存被正确存储的情况下。一致性并不是真正的问题,因为它通常早在内存单元中解决(包括存储到加载转发、阻塞等)。