1

我了解加载存储队列的基本工作原理,即

  1. 当负载计算它们的地址时,它们会检查存储队列中是否存在相同地址的任何先前存储,如果有,则它们从最近的存储中获取数据,否则从写入缓冲区或数据缓存中获取。
  2. 当商店计算他们的地址时,他们检查加载队列是否有任何加载违规

我的疑问是当

  1. 在第一种情况下,由于存储队列中的一些未解析的存储地址而导致加载访问数据缓存,并且在 L1 数据缓存中访问未命中,并且在可以从缓存中检索数据之前,存储地址已解析。现在,商店确实加载队列检查是否有任何违规行为。从属负载之前已经访问过数据缓存,但由于长时间未命中,尚未从缓存中接收到值。商店是发布加载违规还是进行存储到加载转发并从缓存中取消数据?

  2. 当 l1 数据缓存中的加载访问未命中时,加载将放置在 MSHR 中,以免阻塞执行阶段。当未命中解决时,该加载的 MSHR 条目具有有关目标寄存器和物理地址的信息。所以这个值可以在物理寄存器中更新,但是 MSHR 如何与加载队列通信以得知该值可用?这在管道阶段何时发生?因为我在某处读过 MSHR 存储物理地址和 Load-store 队列存储虚拟地址。那么 MSHR 是如何与 LSQ 通信的呢?

我还没有找到任何关于这些疑问的资源。

4

1 回答 1

2
  1. 这是负载绕过旧存储的推测执行。当旧存储解决后,我们可以抛出加载冲突。如果地址别名的概率很低,那么推测执行是有利可图的(更高的吞吐量)——通常对于程序来说应该是正确的。在检测到加载违规时,我们可以采取适当的步骤 - (a) 存储到加载转发,或 (b) 回滚管道到已解决的存储。

  2. 与通过缓存命中提供负载的情况相同(L1 命中可能需要 1-3 个周期)。例如,在具有 CDB(公共数据总线)的保留站中,结果将与所有需要它的硬件结构共享。

于 2021-01-23T07:51:46.007 回答