2016-12-02 55 views
0

管道中有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将开始取I1MEM后取。

哪一个是正确的?

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

+0

我编辑了你的问题。如果您发现我的编辑不愉快,您可以使用左下方的“编辑”按钮进行回滚。 –

回答

1

公约:

表示一个通用的指令。
I1I2I3,...表示具体说明。 S表示管线的通用阶段。
IFIDEXMEMWB表示流水线的特定阶段。
I.S表示指令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一次解码多个指令,缓解了失速问题(但不能消除它)。
它是缓存,尽管提供避免失速的最大好处。

+0

我明白了你的观点。谢谢 ! – Tushar