我了解了加载存储队列的基本工作原理,即
- 当加载计算其地址时,它们会检查存储队列中是否有任何先前存储到同一地址的数据,如果有,则它们会从最近的存储中获取数据,否则会从写入缓冲区或数据缓存中获取数据。
- 当存储计算其地址时,它们会检查加载队列是否存在任何加载违规
我的疑问是当发生什么
在第一种情况下,当由于存储队列中某些未解析的存储地址而加载访问数据缓存时,L1 数据缓存中的访问未命中,并且在从缓存中检索数据之前,存储地址已解析。现在,商店会检查加载队列是否存在任何违规行为。相关负载之前已经访问过数据缓存,但由于长时间延迟未命中,尚未从缓存接收到值。存储是否发布加载违规,或者是否执行存储到加载转发并从缓存中取消数据?
当 l1 数据缓存中加载访问未命中时,加载将被放置在 MSHR 中,以免阻塞执行阶段。当未命中解决时,该负载的 MSHR 条目包含有关目标寄存器和物理地址的信息。因此,该值可以在物理寄存器中更新,但是 MSHR 如何与加载队列通信该值可用?这在管道阶段什么时候发生? 因为我在某处读到MSHR存储物理地址和Load-store队列存储虚拟地址。那么MSHR如何与LSQ通信呢?
我还没有找到任何关于这些疑问的资源。
最佳答案
这是推测执行,负载绕过旧存储。当旧存储解决后,我们可以抛出加载冲突。如果地址别名的概率很低,那么推测执行是有利可图的(更高的吞吐量)——对于程序来说通常应该如此。在检测到加载违规时,我们可以采取适当的步骤 - (a) 存储到加载转发,或 (b) 回滚管道到已解析的存储。
与通过缓存命中提供负载时相同(L1 命中可能需要 1-3 个周期)。例如,在具有 CDB(公共(public)数据总线)的保留站中,结果将与所有需要它的硬件结构共享。
关于queue - 在存在 MSHR 的情况下,加载存储队列如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65851556/