queue - 在存在 MSHR 的情况下,加载存储队列如何工作?

标签 queue cpu-architecture cpu-cache micro-architecture

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

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

我的疑问是当发生什么

  1. 在第一种情况下,当由于存储队列中某些未解析的存储地址而加载访问数据缓存时,L1 数据缓存中的访问未命中,并且在从缓存中检索数据之前,存储地址已解析。现在,商店会检查加载队列是否存在任何违规行为。相关负载之前已经访问过数据缓存,但由于长时间延迟未命中,尚未从缓存接收到值。存储是否发布加载违规,或者是否执行存储到加载转发并从缓存中取消数据?

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

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

最佳答案

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

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

关于queue - 在存在 MSHR 的情况下,加载存储队列如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65851556/

相关文章:

c++ - 系统调用成本

multithreading - MOESI 缓存一致性协议(protocol)相对于 MESI 有什么好处?

java - 从 Mule 中的 VM 队列读取以在 EmailingService 中发送电子邮件

java - 在java中实现ArrayQueue需要toString方法

java - 如何创建 Java 并发队列,以便我们可以在单次调用中阻塞获取超过 1 个元素?

performance - Spectre 修复对排序性能的影响

caching - 缓存缓存更改会阻止崩溃吗?

c - 为什么 ARMv7-A 在从缓存中刷新堆栈指针时会崩溃

linux - perf 事件组中只有 2 个 PERF_TYPE_HW_CACHE 事件

.net - 这似乎是并发集合/队列组合的合理方法吗?