Queue 在MSHR存在的情况下,负载存储队列如何工作?

Queue 在MSHR存在的情况下,负载存储队列如何工作?,queue,cpu-architecture,cpu-cache,micro-architecture,Queue,Cpu Architecture,Cpu Cache,Micro Architecture,我了解load store队列的基本工作原理,即 当负载计算其地址时,它们会检查存储队列中是否有相同地址的任何以前的存储,如果有,则会从最近的存储或写入缓冲区或数据缓存中获取数据 当存储计算其地址时,它们会检查加载队列是否存在任何加载冲突 我的疑问是当 在第一种情况下,当由于存储队列中的某些未解析存储地址而导致加载访问数据缓存时,一级数据缓存中的访问丢失,并且在可以从缓存中检索数据之前,存储地址解析。现在,商店会加载队列检查是否存在任何违规行为。依赖负载之前已访问数据缓存,但由于长延迟未命中,尚

我了解load store队列的基本工作原理,即

  • 当负载计算其地址时,它们会检查存储队列中是否有相同地址的任何以前的存储,如果有,则会从最近的存储或写入缓冲区或数据缓存中获取数据
  • 当存储计算其地址时,它们会检查加载队列是否存在任何加载冲突
  • 我的疑问是当

  • 在第一种情况下,当由于存储队列中的某些未解析存储地址而导致加载访问数据缓存时,一级数据缓存中的访问丢失,并且在可以从缓存中检索数据之前,存储地址解析。现在,商店会加载队列检查是否存在任何违规行为。依赖负载之前已访问数据缓存,但由于长延迟未命中,尚未从缓存接收值。存储区是否发布加载冲突,还是执行存储到加载转发并取消缓存中的数据

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

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

  • 这是一种推测性执行,其中加载绕过较旧的存储。解决旧存储时,我们可以抛出负载冲突。如果地址别名的概率很低,那么推测性执行是有利可图的(更高的吞吐量)-对于程序来说通常应该是这样。在检测到负载冲突时,我们可以采取适当的步骤—(a)将存储向前加载,或(b)将管道回滚到已解决的存储

  • 与通过缓存命中服务加载时相同(一级命中可能需要1-3个周期)。例如,在带有CDB(公共数据总线)的预订站中,结果将与所有需要它的硬件结构共享


  • 2:例如,英特尔CPU重放等待缓存未命中加载结果的UOP,期望它是二级命中,然后是三级命中,然后继续重放,直到最终成功。(如果这些UOP是该端口的最旧UOP)。另请参见的上半部分-但请仔细注意编辑所需的注意事项。@Peter,至少在我对Skylake的测试中,他们似乎只是在预期L1或L2命中而不是L3或更高命中时推测性地发送。这是有道理的,因为L3命中不是恒定的延迟。因此,如果有一条指令直接依赖于负载,那么对于L3或DRAM的未命中,通常会得到3次总调度。当然,如果有更多的依赖指令,您可以得到更多的指令。当您有一系列依赖加载时,这会变得特别有趣。@BeeOnRope:也许我记错了,但我想我们(您)已经看到了很多额外的调度,因为uop在等待RAM的缓存未命中。这可能是一个指针跟踪测试,这样我们就可以一次始终有一个缓存未命中负载,并且其地址已经准备好。IIRC L2命中指针追踪有1个额外调度,L3命中有几个额外调度,似乎L3未命中有足够的额外调度,可以通过在某个点后每5个周期开始调度来解释。或者类似的问题。@BeeOnRope:是否有一个关于uop replay更新描述的好问答?在我们发现从RS重放的不是拆分负载或缓存未命中本身,而是uop依赖于它们之后,我似乎从未抽出时间更新我的一些答案,所以指针跟踪误导了我们。但我希望在评论之外有一个准确的描述。也许在你的维基上?@PeterCordes-是的,每次未命中你都能看到很多重放(最多10次,IIRC),但这些都是在“嵌套”重放的情况下,比如指针追踪,或者在许多UOP依赖于负载的情况下。我不记得有任何重复调度随着时间的推移,纯粹的负载失误,正如你所描述的。但是,对于其他情况,随着时间的推移会出现重复调度,这可能是您所想的:在存储到加载转发的情况下,如果取决于丢失的加载或其他情况,您可以看到存储随时间推移的大量重播。