我正在做一个项目,用VHDL实现具有某种缓存一致性(我选择了MESI)的双处理器系统。我只想确认一件事:对共享缓存行的写命中应该会导致缓存控制器在共享总线上发送无效消息,并且取决于争用,它应该使处理器延迟一段时间,对吗?
我在考虑这个场景;假设处理器做了这样的事情:
for (int i = 0; i < 5; ++i)
arr[i * 10] = 0; //just so each write is in a different cache line如果数组完全驻留在缓存中,并且与其他处理器共享,则每次写入将生成一条无效消息,每个消息需要多个周期才能完成;要使处理器继续执行,所有这些无效消息都必须被缓冲,并且缓冲区不会受到限制,因此写入命中将不得不使CPU停顿一段时间。我说得对吗?
编辑:介意解释一下否决的原因吗?这个问题的哪一部分不清楚?或者如果你认为这是一个愚蠢而可怕的问题,那么我想你一定有答案了吧?
发布于 2015-06-08 20:50:49
不要混淆延迟和吞吐量。无效消息将需要多个周期才能完成,但您可以对流程进行管道处理。可以构建一个流水线缓存,它能够在以前的消息完成之前开始处理新的失效消息。
MESI协议并不要求在可以启动新消息之前,已经完成了发送到不同缓存行的所有消息。
只要缓存提供足够的吞吐量,飞行中无效消息的数量就会被绑定。如果每个周期可以生成1条失效消息,而每条消息需要10个周期来处理,但缓存也可以处理每个周期的1条无效消息,则多达10条无效消息将处于运行状态,并且您的处理器不必在共享行的写命中时停止运行。
https://stackoverflow.com/questions/30558517
复制相似问题