2

在MESI协议中当一个CPU:

  • 执行读取操作
  • 发现缓存行处于无效状态
  • 其他缓存中没有其他非无效副本

它需要从内存中获取数据。这将需要一定数量的周期才能做到这一点。那么高速缓存行的状态是立即从(I)变为(E)还是仅在从内存中获取数据之后?

4

2 回答 2

1

我认为缓存通常会等待数据到达当它还不存在时,您实际上无法在缓存中对同一行的其他请求进行命中,而只能对实际存在的其他行进行命中(未命中命中)。因此,该行的状态仍然无效;该标签的数据无效,因此您还不能将其设置为有效状态。

您希望同一行的另一个未命中(未命中的未命中)注意到该行已经有一个未完成的请求并将其自身附加到该行请求缓冲区。(例如 Intel x86 LFB = 行填充缓冲区)。由于发现 Invalid 触发器查看填充缓冲区但 Exclusive 没有,因此您也希望 Invalid 基于此推理。

例如 Skylake perf-counter 事件mem_load_retired.fb_hit计数,来自perf list输出:

[已退休的加载指令,哪些数据源被加载错过了 L1,但由于先前的未命中而命中 FB 到同一高速缓存行且数据未准备好。
精确时支持地址(精确事件)]

在没有内存级别并行性的非常旧/简单或玩具 CPU 的缓存中(整个管道或仅内存访问完全停止执行,直到数据到达),区别是没有意义的;当请求的数据正在进行时,缓存不会发生任何其他事情。

在这样的 CPU 中,它只是一个实现细节。(除了在负载运行时它仍应处理来自其他内核的 MESI 请求,因此标签需要再次反映正确的状态,否则在决定如何回复时需要检查额外的东西。)

于 2019-11-18T12:11:48.380 回答
1

从内存中取出数据后。

在实践中,MESI(或任何其他协议)除了 M/E/S/I 的主要状态外,还有许多过渡状态。在您的示例中,一致性协议将转换为“等待数据填充”状态,并且仅在获取数据并设置有效位后才会转换为 E。

参考:gem5/ruby 中的缓存一致性协议——http://learning.gem5.org/book/part3/MSI/cache-transitions.html 搜索“无效,要共享”)可能有用。

于 2019-11-18T19:00:52.257 回答