Load/Store 个单元并在管道中

Load/Store unit and in pipeline

我正在学习 CPU 和管道。我们知道在处理器管道执行阶段存在一些加载存储单元。

现在我想知道,如果我们有一个加载指令需要很长时间,因为缓存中不存在请求的数据,下一个加载指令将不会执行,直到第一个加载乱序解决cpu 除非我们在管道执行阶段有另一个 load/store 单元?

中序的对应行为是什么CPU?

缓存未命中加载会阻止以后的加载吗? CPUs可以设计成避免

您要查找的术语是 hit under miss 用于缓存访问,同时等待未完成的缓存未命中,miss under miss 因为有多个缓存未命中(内存级并行)。

请参阅 https://www.ece.ucsb.edu/~strukov/ece154BSpring2018/week3.pdf 了解非阻塞缓存和流水线缓存。


无序CPU中,这可以通过暂时给出加载指令来处理,稍后再从调度程序重播。至少,这就是 Intel x86 CPUs 所做的。 CPU 具有像 ARM 这样的弱排序内存模型的系统可能只需要有一个加载缓冲区等待该缓存行到达 L1d 缓存,而不必重新运行 加载指令。

在有序流水线上,负载可以是scoreboarded,因此在您尝试实际读取由缓存未命中负载写入的寄存器之前,不会停止.您需要一些加载缓冲区来等待传入的缓存行,但是 hit-under-miss 和 miss-under-miss 就可以了。

(Paul Clayton 在 https://electronics.stackexchange.com/questions/98551/what-happens-on-a-cache-miss 上发布了一个更详细的答案)

请记住,按顺序只意味着指令必须开始按程序顺序执行。高延迟指令,如除法,尤其是存储和加载,可能会乱序完成。即使缓存 hit 存储在现代高速有序设计中也有足够的延迟,您想让其他指令 运行 处于该延迟的阴影下。


管道的不同复杂程度可能支持也可能不支持未命中and/or未命中。即不同数量的 MLP(内存级并行)。

无序CPU几乎总是同时支持两者; OoO exec 的主要 优势之一是隐藏内存延迟以及 ALU 延迟。


Cortex-A8's glossary提到了Hit Under Miss,但IDK他们实际上用这个词来明确表示A8是否支持它。

我确实找到了 16.4.2. Memory system effects on instruction timings 上面写着:

Because the processor is a statically scheduled design, any stall from the memory system can result in the minimum of a 8-cycle delay. This 8-cycle delay minimum is balanced with the minimum number of possible cycles to receive data from the L2 cache in the case of an L1 load miss. Table 16.16 gives the most common cases that can result in an instruction replay because of a memory system stall.

条件列表包括 L1 加载数据缺失。随后的 L2 未命中会导致另一次重放,将后面的指令再延迟 8 个周期。

这听起来确实像 A8 支持高速缓存未命中时的任何内容,而是基本上停止。