使用 MESI 协议,写入命中也会使处理器停顿,对吗?

With the MESI protocol, a write hit also stalls the processor, right?

我正在做一个项目,该项目是在 VHDL 中实现具有某种高速缓存一致性(为此我选择了 MESI)的双处理器系统。我只想确认一件事:共享缓存行上的写命中应该导致缓存控制器在共享总线上发送无效消息,并且根据争用,它应该使处理器停止一段时间,对吗?

我在想这个场景;假设一个处理器做这样的事情:

for (int i = 0; i < 5; ++i)
    arr[i * 10] = 0; //just so each write is in a different cache line

如果数组完全驻留在缓存中,并与其他处理器共享,则每次写入都会产生一条失效消息,每次写入都需要多个周期才能完成;为了让处理器继续执行,所有这些无效消息都必须被缓冲,并且缓冲区不会受到限制,因此写入命中将不得不使 CPU 停止一段时间。我说得对吗?

编辑: 愿意解释否决票吗?这个问题的哪一部分不清楚?或者,如果您认为这是一个愚蠢而可怕的问题,那么我想您一定有答案了?

不要将延迟与吞吐量混淆。失效消息将需要多个周期才能完成,但您可以流水线化该过程。可以构建一个流水线缓存,它能够在先前的失效消息完成之前开始处理新的失效消息。

MESI 协议不要求在开始新消息之前完成所有先前到不同缓存行的消息。

只要缓存提供足够的吞吐量,传输中的失效消息的数量就会受到限制。如果您每个周期可以生成 1 条无效消息并且每条消息需要 10 个周期来处理,但是您的缓存也可以每个周期处理 1 条无效消息,那么最多 10 条无效消息将在运行中并且您的处理器不必在写入时停止点击共享线路。