我認爲現有答案中缺少的是「旁路」或「轉發」數據路徑的存在。爲了簡單起見,我們堅持使用MIPS 5級流水線。每條指令從出生到死亡需要5個週期 - 取指,解碼,執行,內存,寫回。這就是處理單條指令需要多長時間。
你想知道的是,一條指令將其結果交給一條相關指令需要多長時間。假設你有兩個連續的ADD指令,而且也通過R1的依賴關係:
ADD R1, R2, R3
ADD R4, R1, R5
如果沒有轉發路徑,我們不得不拖延多個週期(2或3的第二指令取決於寫回是如何工作的),因此第一個可以將其結果存儲到寄存器文件中,然後第二個讀取結果作爲解碼階段的輸入。
但是,有轉發路徑允許從流水線中選出有效的結果(但還沒有寫回的結果)。假設第一個ADD從解碼中的寄存器文件獲取所有輸入。第二個將R5取出寄存器文件,但它將在執行階段之後將R1從流水線寄存器中取出。換句話說,我們將ALU的輸出路由回到一個週期後的輸入。
亂序處理器無處不在地使用轉發。他們將有許多不同的功能單位,有很多不同的延遲。例如,ADD和AND通常需要一個週期(TO DO THE MATH,拋開前後所有的流水線階段),MUL會像4,浮點運算需要很多週期,存儲器訪問有可變延遲(由於緩存未命中)等。
通過使用轉發,我們可以將指令的關鍵路徑僅限於執行單元的延遲,而其他所有內容(取指,解碼,退休),它超出關鍵路徑。指令被解碼並轉儲到指令隊列中,等待它們的輸入由其他執行指令產生。當一個指令的依賴性得到滿足時,它就可以開始執行。
讓我們看看這個例子
MUL R1,R5,R6
ADD R2,R1,R3
AND R7,R2,R8
我會作出嘗試在繪製時間軸,顯示這些指令通過管道流。
MUL FDIXXXXWR
ADD FDIIIIXWR
AND FDIIIIXWR
重點:
F - Fetch
D - Decode
I - Instruction queue (IQ)
X - execute
W - writeback/forward/bypass
R - retire
所以,你看,乘法指令有9個循環的總壽命。但是MUL和ADD的執行有重疊,因爲處理器是流水線的。當ADD進入IQ時,它必須等待它的輸入(R1),同樣依賴於ADD的結果(R2)的AND也是如此。我們關心的不是MUL總共生活多久,而是任何依賴性指令需要等待多長時間。這是它的有效延遲,這是4個週期。正如你所看到的,一旦ADD執行,由於轉發,依賴的AND可以在下一個週期執行。
當您說XOR具有「1個週期的延遲」時,您的意思是什麼?你的來源是什麼?這似乎是一種無意義的測量。 –
Agner霧的圖表(http://agner.org/optimize/instruction_tables.pdf)。這意味着XOR需要1個時鐘週期才能執行,因此等待時間爲1,而BSR需要3個。 – IamIC
您是否閱讀過他對延遲意味着什麼的解釋?如果是這樣,我不明白爲什麼你會說「XOR在1個週期內完成,並且延遲爲1個週期,表明它不會經歷全部14個階段」。 –