管道有5个阶段。
I1
考虑使用“操作数转发” 解决方案说: -
说明
Load
是I2
指令。因此,在I1
完成其EXE
阶段之前,无法获取下一条指令(MEM
)。
但我认为:在WB
阶段,处理器访问内存并选择所需的单词。在MEM
阶段,它更新了注册登记处
因此,在I2
阶段处理器保持对内存的控制之前,MEM
将在I1
{{1}}之后开始提取。
哪一个是正确的?
尚未给出阶段描述,根据我的知识编写。
答案 0 :(得分:1)
公约:
我表示通用指令 I1 , I2 , I3 ,...表示具体说明。 S 表示管道的通用阶段 IF , ID , EX , MEM , WB 表示特定的管道。
I.S 表示指令 I 处于 S 阶段的循环。
指令 I2 需要 R0 ,但该寄存器不能从 I1 准备就绪,直到 I1.WB 已经完成,假设一个基本的管道 当存在操作数转发时, I2 可以在 I1 将其写回寄存器文件时读取结果,即在 I1.WB 期间。< / p>
由于操作数是在 ID 阶段读取的,因此 I2.ID 和 I1.WB 必须同时发生。
/>
这意味着 I2.IF 必须在 I1.MEM 的同一时间发生。
现在你对CPU在同一时钟内执行两次读取(一次用于取指令,另一次用于加载)的能力表示怀疑。
非常简单的CPU实际上会停止这种冲突(在您的示例中, I2.IF 将发生在 I1.WB )。
避免停顿的最简单方法是Harvard architecture,其中CPU从不同的内存中获取指令。
哈佛建筑has been modified通过使用缓存和预取数据和指令。
在这种情况下,只有当加载和指令获取都需要访问存储器(而不是高速缓存)时才会发生停顿。
现代桌面架构具有L1数据缓存,可以一次处理多个访问,并且CPU与它们紧密耦合,以便可以同时执行两个或更多个加载/存储,与L1的负载并行指令缓存。
最后,一些现代CPU一次解码多条指令,缓解了失速问题(但并未消除)。
尽管如此,缓存可以最大限度地避免失速。