3

我认为,为了让 CPU 继续执行后续指令,存储缓冲区必须做部分 MESI 处理以获得缓存一致性,因为最新的值存储在存储缓冲区而不是缓存中。因此,存储缓冲区发送读取无效或无效 REQ 消息,并在 ACK 到达后刷新最新值到缓存。
而 Cache 做不到。

我的分析和结果对吗?
还是所有MESI处理都由缓存完成?

4

1 回答 1

3

在大多数设计中,存储缓冲区不会直接发送无效请求,并且通常甚至不会被外部请求窥探1 。也就是说,它是一致性域的私有/核心侧的一部分,因此不需要参与一致性。相反,存储缓冲区最终与缓存子系统的第一级交互,该子系统本身将负责 MESI 协议的各个部分。

当然,这种交互如何运作完全取决于设计。一个简单的设计可能一次只处理一个存储:位于存储缓冲区头部的最旧的存储并执行该地址的 RFO,完成后移动到下一个元素。更复杂的设计可能会为存储缓冲区中的几个“即将到来的”请求发送 RFO,以尝试利用更多的 MLP。在 x86 上,我不清楚确切的机制:在某些情况下,存储到 L2 的性能似乎很差,但我很确定,与串行处理相比,存储到 RAM 的一堆未命中的性能会好得多。


1有一些例外,例如同时多线程(x86 上的超线程)涉及两个逻辑内核共享所有级别的缓存,因此能够利用正常的缓存一致性机制,可能需要存储缓冲区探听。

于 2018-04-18T20:18:52.237 回答