【问题标题】:How does instruction after Load, execute?Load后的指令如何执行?
【发布时间】:2017-04-16 23:48:28
【问题描述】:

管道中有 5 个阶段。

IF -  Instruction fetch
ID -  Instruction Decode, read the register  
EX -  On a memeory reference add up base and offset, 
      and for arithmetic instruction do the math.   
MEM - If load or store access memory
WB -  Place the result in appropriate register.     



 I1 : R0 <- M[loc]      IF | ID | EX | MEM | WB |

 I2 - R0 <- R0 + R0                  | IF  | ID | EX | MEM | WB  | 

 I3 - R2 <- R2 - R0                        | IF | ID | EX  | MEM | WB |

考虑使用“操作数转发”。
解决方案说:-

指令I1Load 指令。所以下一条指令(I2)在I1 完成其EXE 阶段之前无法获取。

但我认为:在MEM 阶段,处理器访问内存并选择所需的单词。在WB 阶段,它会更新注册表。
因此,直到MEM 阶段,处理器控制着内存,所以I2 将在MEMI1 之后开始获取。

哪一个是正确的?

没有给出阶段的描述,它是根据我的知识编写的。

【问题讨论】:

  • 我编辑了你的问题。如果您觉得我的编辑不愉快,可以使用左下角的“编辑”按钮回滚。

标签: pipeline cpu-architecture pipelining


【解决方案1】:

约定:

I 表示通用指令。
I1, I2, I3, ... 表示具体说明。 S 表示管道的通用阶段。
IFIDEXMEM WB表示流水线的特定阶段。
IS表示指令I在哪个周期阶段S

指令 I2 需要 R0 但该寄存器不会从 I1 准备好,直到 I1.WB已经完成,假设有一个基本的管道。
在存在操作数转发的情况下,I2 可以在 I1 将结果写回寄存器文件时(即在 I1.WB 期间)读取结果。

由于在ID阶段读取操作数,I2.IDI1.WB必须同时发生。
这意味着 I2.IF 必须与 I1.MEM 同时发生。


现在您对 CPU 在同一时钟内执行两次读取(一次用于指令提取,一次用于加载)的能力存有疑问。
非常简单的 CPU 实际上会因此类冲突而停止(在您的示例中,I2.IF 将发生在 I1.WB)。

避免停顿的最简单方法是Harvard architecture,CPU 从不同的内存中获取指令。

哈佛架构has been modified 通过使用缓存以及数据和指令的预取。
在这种情况下,只有当加载和取指令都需要访问内存(而不是缓存)时才会发生停顿。

现代桌面架构具有 L1 数据缓存,可以一次处理多个访问,并且 CPU 与它们紧密耦合,因此可以同时执行两个或多个加载/存储,与来自 L1 的加载并行指令缓存。

最后,一些现代 CPU 一次解码多个指令,缓解了停顿问题(但并未消除它)。
但是,缓存在避免停顿方面提供了最大的好处。

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多