設計一個簡易的處理器(6)--簡單的流水線實現PIPE-
上一篇已經介紹了SEQ+的實現,本篇介紹流水線的通用原理及其簡單的流水線實現PIPE-.
SEQ/SEQ+的侷限性
————
通過前面幾篇文章介紹SEQ/SEQ+,不難發現SEQ/SEQ+的一些侷限性.
-實際中的SEQ/SEQ+太慢, CPU的時鐘太慢,效能太差.
-在每一個時鐘週期中,必須更新一條指令的所有可見狀態(包括儲存器,暫存器檔案,條件碼和指令暫存器, PC).
-沒有充分利用CPU的各個硬體單元(一個時鐘週期內只有少量時間硬體單元是活動的).
基於以上幾點, SEQ/SEQ+無法達到實際的需求,引入了流水線系統.
流水線的通用原理
————
1.流水線的引入
在設計一個流水線化的處理器之前
假定在一個非流水線化的硬體系統中,如下圖所示,該系統由一個執行計算的邏輯和儲存計算結果的暫存器構成.
在每個320ps的週期內,系統用300ps(1s=1012ps)計算組合邏輯函式, 20ps用來儲存計算結果至暫存器中.
定義延遲(latency)和吞吐量(throughput).
延遲:執行一條指令所需要的時間,稱為延遲.
吞吐量:延遲的倒數
則:吞吐量 = 1/((20+320)*10-12)=3.12*109IPS =3.12GIPS(GIPS: 每秒千兆條指令)
如果將上述系統的執行的計算分為三個階段A, B, C,每個階段都為100ps.並且在階段之間加入流水線暫存器(用來保留的中間結果).如下圖所示:
可以知道:吞吐量=1000/(100+20) = 8.33GIPS
2.流水線的優點和侷限性
優點-流水線的引入,通過流水線的深度提高了系統的吞吐量,更加了系統的處理效能.
侷限性:
-不一致劃分.理想的流水線可以均分,但是現實中往往會不一致的劃分.系統的吞吐量受最慢階段的制約,導致某些階段並不完全處於活動狀態 .
-流水線過深,收益下降
-現實中,流水線往往帶有反饋.需要增加更多的控制邏輯.
流水線技術是典型的空間換時間的技術.現代處理器的流水線很深(15或者更多的階段),來提高時鐘頻率(主頻).
先睹為快:簡單的流水線系統PIPE-
————
可以在SEQ+的基礎上,在各個階段之間,加上流水線暫存器,改造成PIPE-.先睹為快,稍後分析.
PIPE-的硬體結構
上圖說明:
整個硬體框圖.實際上大部分內容與SEQ+相同.變化有:
- 訊號的重新組織與命名.在原有輸入訊號前面加上流水線暫存器名稱(大寫)以區分各自用到的訊號,如 D_icode, E_icode, M_icode, and W_icode;如果這些訊號是某一階段產生的,則以小寫字母作字首,如在Execute階段產生的e_valE訊號.
- 在Fetch階段增加了Predict PC部件來預測下一條指令的地址(後面詳細介紹).
- 將valP和valA在Decode階段合併為一個訊號,所以多了一個Select A部件(後面詳細介紹).
分析PIPE-
————
1. PIPE-的各個階段(向上路徑)
(1).取指:
-選擇當前的PC(因為PC的計算量很小,所以與Fetch合併)
-從儲存器中讀取指令至指令暫存器.
- PC increment
(2).譯碼 -讀取程式暫存器
(3).執行 - ALU
(4).訪存 - Read/Write資料暫存器
(5).寫回 -更新程式暫存器檔案.
2.PIPE-的反饋路徑
仔細觀察PIPE-的硬體結構,不難發現有兩條反饋路徑(介紹控制邏輯的時候纖細介紹).
(1).Selected PC
(2).Register updates
PIPE-的兩處重要的變化
————
1. Select A
主要用處是減少控制訊號和暫存器的數目.因為只有call指令會在memory階段用到valP,只有jxx指令會在execute階段用到valP. 這兩種指令都不需要用到暫存器A.所以可以將這兩個控制訊號合併.
2. Select PC
(1). Predicting PC的理論
流水線系統中,各個硬體單元都得到充分利用,取指模組取完一條指令後,取下一條指令.但是流水線系統中的程式可見的狀態是分階段更新的,導致沒有辦法在指令剛完成fetch就知道下一條指令在哪裡.這就產生了Predicting PC.
Predicting PC包含了兩個方面,一個是如何預測PC,另一個是如何從錯誤的預測中恢復過來.
預測PC有很多種方法,下面介紹PIPE-使用的一種簡單的策略.
- 不傳遞控制的指令.下一條指令始總是valP.
- call/jump.下一條指令總是valC.
- jxx. PIPE-預測下一條指令的位置是valC(60%的正確率).
- ret. PIPE-對ret指令不預測.
我們發現只有jxx和ret的下一條指令時不確定的, PIPE-採用的是一種非常簡單的策略,當然有針對jxx和ret的更加優秀的策略,但是無疑增加了控制旁路.
(2). PIPE-的PC的選擇和取指邏輯
intF_predPC = [
f_icodein {IJXX, ICALL} : f_valC;
1:f_valP;
];
Select PC的邏輯(注意這是一個反饋路徑)
int f_PC = [
#mispredicted branch. Fetch at incremented PC
M_icode== IJXX && !M_Bch : M_valA;
#completionof RET instruciton
W_icode== IRET : W_valM;
#default:Use predicted value of PC
1:F_predPC
];
現有PIPE-的功能和侷限性
————
下圖是PIPE-的流水線的演示:
這裡可以解釋一下"為什麼我們的各個階段是自下向上的啦".可以看Cycle5.正好是F-D-E-M-W.
必須要強調一點, PIPE-是有致命缺陷的, PIPE-無法解決資料相關和控制相關的問題.預知後勢如何,請看下文分解
(Copyright© 2011, Randal E. Bryant and David R. O'Hallaron )
reference: