2015-09-21 36 views
1

我錯過了一些基本的思路。 CPU流水線:在基本層面上,爲什麼指令要完成不同數量的時鐘週期,以及某些指令在多級CPU中只需要一個週期?瞭解CPU流水線階段與指令吞吐量

除了明顯的「不同指令需要不同數量的工作來完成」,聽我說......

考慮的酷睿i7與約14級流水線。這需要14個時鐘週期才能完成貫通。 AFAIK,這應該意味着整個管道的延遲爲14個時鐘。但事實並非如此。

XOR在1個週期內完成,延遲爲1個週期,表明它不會經歷所有14個階段。 BSR的延遲時間爲3個週期,但每個週期的吞吐量爲1。 AAM的延遲時間爲20個週期(更多的是階段計數),吞吐量爲8(在Ivy Bridge上)。

某些指令不能在每個時鐘發出,但要完成的時間少於14個時鐘。

我知道多個執行單元。我不明白指令在延遲和吞吐量方面的長度是如何與管道階段的數量相關的。

+0

當您說XOR具有「1個週期的延遲」時,您的意思是什麼?你的來源是什麼?這似乎是一種無意義的測量。 –

+0

Agner霧的圖表(http://agner.org/optimize/instruction_tables.pdf)。這意味着XOR需要1個時鐘週期才能執行,因此等待時間爲1,而BSR需要3個。 – IamIC

+0

您是否閱讀過他對延遲意味着什麼的解釋?如果是這樣,我不明白爲什麼你會說「XOR在1個週期內完成,並且延遲爲1個週期,表明它不會經歷全部14個階段」。 –

回答

3

我失去了一些基本的東西。 CPU流水線:在基本層面上,爲什麼指令要完成不同數量的時鐘週期,以及某些指令在多級CPU中只需要一個週期?

因爲我們感興趣的是指令之間的速度,而不是單條指令的開始到結束時間。

除了明顯的「不同指令需要不同數量的工作來完成」,聽我說......

嗯,這是關鍵答案,爲什麼不同的指令有不同的延遲。

考慮一個帶有大約14級管線的i7。這需要14個時鐘週期才能完成貫通。 AFAIK,這應該意味着整個管道的延遲爲14個時鐘。但事實並非如此。

這是正確的,雖然這不是一個特別有意義的數字。例如,爲什麼我們關心CPU完全執行指令需要多長時間?這基本上沒有影響。

XOR在1個週期內完成並且具有1個週期的延遲,表明它不經歷全部14個階段。 BSR的延遲時間爲3個週期,但每個週期的吞吐量爲1。 AAM的延遲時間爲20個週期(更多的是階段計數),吞吐量爲8(在Ivy Bridge上)。

這只是一堆誤解。異或將一個週期的延遲引入到依賴鏈中。也就是說,如果我做了12條指令,每條指令修改前一條指令的值,然後添加一條XOR作爲第13條指令,則它將多花一個週期。這就是延遲意味着什麼。

某些指令不能在每個時鐘發出,但要花不到14個時鐘才能完成。

沒錯。所以?

我知道多個執行單元。我不明白指令在延遲和吞吐量方面的長度是如何與管道階段的數量相關的。

他們沒有。爲什麼應該有任何聯繫?假設在流水線開始時有14個額外的階段。爲什麼會影響延遲或吞吐量呢?這意味着所有事情都會在14個時鐘週期後發生,但仍然以相同的速度發生。 (儘管可能會影響錯誤預測的分支和其他事情的成本)。

+0

那麼,你明白它是如何工作的。我可以找到的每個示例都顯示了RISC(不是CISC)管道,其中每條等長指令遍歷管道的所有(通常爲5個)階段。每個階段執行不同的功能。例如:XOR和BSR是否在所有14個(說)階段執行?如果我們將研討會階段描繪成研討會的工作站,我們就會發現一個工作崗位需要從一個工作崗位轉到另一個工作崗位,並逐漸完成工作,最終退休。但是爲什麼有些指令會造成> 1個週期的延遲?我希望你能理解我的問題。 – IamIC

+0

@IanC在流水線中的每一點,除非該指令所依賴的所有先前指令已經提供了該指令需要進入下一階段的任何指令,否則下一條指令不能進入流水線的下一個狀態。如果一行中的兩條指令需要延遲第二條指令,那麼第一條指令將引入多於一個的延遲週期。例如,考慮一個乘法,然後是結果的增量。在某個時候,增量將不得不等待乘法才能取得更多進展。 –

+1

@IanC指令經常在管道中停頓,因爲它們不需要進入下一步所需的條件。這包括需要從主存儲器訪問信息,需要其他指令使用的執行資源,需要先前指令的結果等等。 –

2

我認爲現有答案中缺少的是「旁路」或「轉發」數據路徑的存在。爲了簡單起見,我們堅持使用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可以在下一個週期執行。