2016-05-23 68 views
0

我在做一些關於流水線的問題。這一個我需要幫助。加載指令後的流水線失速,但沒有添加指令後

爲什麼能有一個加載指令後流水線停頓而不是 附加指令後?

我知道管道中一個未使用的槽被稱爲管道延遲。我的猜測是,它可能是加載指令後的管道延遲,因爲我們需要等待可能更新的寄存器。但是我無法想出一個答案,說明爲什麼add指令不能創建管道延遲。也許是因爲在這個階段我們已經從註冊表中讀取了?

+0

添加往往只有1週週期的延遲,因此與轉發(又稱搭橋)的結果一個add可以被下一條指令使用。 [這個問題可能是相關的](http://stackoverflow.com/questions/19041315/pipeline-stalling-and-bypassing-examples),但我沒有讀它。 –

回答

2

流水線失速用於解決通常由數據依賴造成的危害。一個add可以實際產生一個流水線延遲,但我們首先考慮一個不包含的例子。

SUB r2, r3 
ADD r1, r2 

即使add指令使用減法的結果,也沒有失速。這是因爲EX階段可以訪問前一個EX階段的數據。

現在讓我們考慮一個例子,其中添加可以產生一個失速。

LOAD r2, RAM[a] 
ADD r1, r2 

這裏,由加載指令的MEM級產生的數據需要作爲ADD指令的EX級的輸入。 EX階段只能訪問前一個EX階段的數據,因此由於寫入後的讀取危險而導致流水線停滯。這是通過該圖

這是通過引入氣泡進入管道(如NOP)解決這樣就解決了數據相關性,而無需在時間向後傳播的數據(這是不可能的)中示出。

enter image description here

您可以通過hazardsbubbles讀了更多地瞭解這個在更多的細節,並forwarding

+0

來自加載消耗的負載的數據並不是真正的「增加」,導致IMO失速。我將它歸因於負載,而不是消費者,因爲負載會在後期在管道中產生結果,而不是ALU操作。 –

+0

另外,在經典的RISC流水線的這個例子的EX階段,是否需要準備好加載地址,或者是否可以通過1c延遲執行指針追蹤,只是將載入的數據從MEM階段轉發回MEM階段? –

+0

@PeterCordes我會爭辯說,添加IS生產一個攤位。這是因爲沒有這個指令,就不會發生失速。暫停是由導致數據依賴性的指令產生的。如果您刪除了添加指令,則不會發生失速。因此,我會爭辯說,'加'確實產生了失速。至於你的第二個問題,通過操作數轉發可以實現指針追蹤。 「EX」階段可以從前一個「EX」階段讀取數據,「MEM」階段可以從前一個「MEM」階段讀取數據。 –