如何让缓存重新访问被驱逐的数据?

问题描述

我试图让最后一级缓存(经典缓存模型,而不是 Ruby)在一段时间后重新访问一些被驱逐的缓存行(当 cpu 当前没有请求那些缓存行),但我注意到所有数据请求都是通过数据包从 cpu 内核发出的。这还能实现吗?

如果可以实现,我应该从最后一级缓存创建一个新数据包并将其发送到主内存吗?或者可能在缓存驱逐完成后预取被驱逐的缓存行?

有人可以给我一些关于这个的建议吗?非常感谢!

解决方法

这听起来像是预取器。检查任何现有的预取器(src/mem/cache/prefetch/)是否满足您的要求;否则,您将不得不添加自己的。我认为你必须做后一种选择,因为 IIRC,他们不遵守驱逐。

您的预取器需要两件事:

  1. 必须知道何时发生驱逐,并观察被驱逐的地址。
  2. 它应该为您想要的驱逐块生成预取请求。

对于1,监听数据更新探测(缓存的 ppDataUpdate 成员)应该很简单,这样你的预取器就能够观察到驱逐。当 DataUpdate 内容为:oldData 非空且 newData 为空时,会发生驱逐。有关如何收听该探测的示例,请参阅 FrequentValues 压缩器。

最后,对于 2,您的新预取器应该覆盖 calculatePrefetch()。有关简单示例,请参阅 Tagged 预取器。