2016-12-02 99 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