1. 程式人生 > >設計一個簡易的處理器(6)--簡單的流水線實現PIPE-

設計一個簡易的處理器(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部件來預測下一條指令的地址(後面詳細介紹).
  • valPvalADecode階段合併為一個訊號,所以多了一個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指令不預測.

我們發現只有jxxret的下一條指令時不確定的, PIPE-採用的是一種非常簡單的策略,當然有針對jxxret的更加優秀的策略,但是無疑增加了控制旁路.

(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: