4

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

我正在考虑这种情况;假设一个处理器做这样的事情:

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

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

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

4

1 回答 1

2

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

MESI 协议不要求在可以启动新消息之前已经完成了所有先前到不同缓存行的消息。

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

于 2015-06-08T20:50:49.603 回答