本文是對流水線技術地基本概念、冒險處理、硬件實現的基本概述。首先我們介紹流水線的工作原理、組成要求、分類和性能指標,接下來討論流水線的冒險處理,最后我們以MIPS為例,介紹流水線數據通路和控制器的實現。
1. 流水線概念
針對串行執行過程中的冗余和瓶頸,我們提出,可以將指令執行過程划分為多個階段,各個階段可以同時處理操作,這樣,每條指令按序通過各段,不同指令的執行過程重疊,得到的就是流水線。
流水線由多個功能段按序組成。例如,在RISC中,通常包括IF,ID,EX,MEM,WB五個功能段,而在CISC中,通常包括IF,ID,OF,EX,WB五個功能段。
理想狀況下,流水線可以對程序執行起到顯著的加速作用。例如,有n條指令在m段流水線上執行,串行執行的時間為mnt,而采用流水線后,其執行時間為(m+n-1)t。
流水線在組成上,有三個基本要求。
第一,各個段的操作要相互獨立、相互分離。因此,每個段的源數據必須來自時序部件,結果也要存到時序部件。實現上,我們設置段間寄存器,其中保存本段的所有后續段需要的本段的數據、地址、命令等。
第二,各個流水段的操作要同步執行。實現上,我們會設置公共拍時鍾,使得段間寄存器被同時寫入。拍時鍾的周期需要取為各個段長的最大值。
第三,各個流水段的操作必須無沖突,以保證結果正確。具體而言,就是消除冒險。實現上,通過增設部件和控制器,來消除各種冒險。
流水線可以按其屬性進行多種分類。
按處理的級別,可以分為操作級流水線、指令級流水線、處理機級流水線。
按功能,可以分為單功能和多功能流水線。多功能流水線的各流水段可以進行不同的連接,從而完成不同的功能。
按工作方式,可以分為靜態流水線和動態流水線。靜態流水線在進行功能切換時,必須排空。顯然,動態流水線一定是多功能流水線。
按結構,可以分為線性流水線和非線性流水線。所謂非線性流水線,就是其中有部件的復用。
按流入流出的次序,可以分為順序流水線和亂序流水線。
流水線的性能指標包括吞吐率、加速比、效率等。
吞吐率指的是單位時間內完成的任務數量,即TP=n/T_流水 →1/t,因此優化吞吐率的方法是降低段長,通過細分瓶頸段或重復設置部件的方式完成。
加速比指的是串行執行時間和流水執行時間的比值,即S=nm/(m+n-1)→m,因此優化加速比的方法是增加段數。
效率即部件利用率E,為部件利用時間占總流水執行時間的比值,即任務所占時空區與所有段總時空區的比值,實際效率為E=n/(m+n-1)→1,因此增加任務數量就能提高效率。對於線性流水線,效率與吞吐率、加速比有關系E=S/m=TP⋅t。
流水線段數的選擇主要有兩條思路。針對額外開銷考慮,應當使段長遠大於段間寄存器偏移和時鍾偏移。針對性價比考慮,由吞吐率TP=(T/m+d)^(-1),總價格C=a+bm,最大化性價比PCR=TP/C。
2. 流水線的冒險處理
指令之間的依賴關系稱為相關,具體包括數據相關、名相關(反相關/輸出相關)、控制相關。由相關引起的流水異常稱為冒險。因此,冒險也分為結構冒險、數據冒險、控制冒險。
由爭用硬件資源產生的冒險稱為結構冒險。為阻止其產生,要求每個部件只能使用一次且使用時間固定。具體處理時,對於高頻沖突,重復設置部件;對於低頻沖突,分時使用部件。
因重疊執行,指令所需的數據暫時不可用,稱為數據冒險。數據冒險通常包括RAW、WAR、WAW等,處理方法通常包括阻塞、轉發、亂序執行。
阻塞法的策略是阻塞沖突指令及其后續指令直到RAW冒險消除。實現上,只要檢測到RAW,就通過不寫PC和IF/ID寄存器來暫停IF段,通過將nop寫入ID/EX寄存器來產生氣泡。停頓的時長為數據從請求讀出到實際可讀的間隔拍數。
轉發法的策略是讓沖突指令從數據產生段獲取數據來消除冒險。實現上,為了簡化實現,通常在使用時獲取,需要增設轉發線路。在能成功轉發時不停頓,否則停頓時長與阻塞法一致。轉發法通常只能處理運算指令,對於load-use冒險無能為力,只能通過阻塞來消除冒險。
亂序執行法的策略是只停頓沖突指令,而后續沒有RAW冒險的指令可以先執行。要實現支持亂序流動的流水線,需要增設指令窗口並采用動態調度方法。亂序執行引入了WAR/WAW冒險。
在遇到跳轉分支指令時,因指令執行順序改變,引起流水線停頓,產生的冒險稱為控制冒險。處理控制冒險的方法有阻塞法、分支預測法、延遲分支法。
阻塞法的策略是阻塞分支指令之后的指令,直到分支指令執行完,即控制冒險消除。實現上,一旦ID段檢測到控制冒險,就立即暫停IF段,ID段從下拍起產生氣泡。停頓的時長為ID段到PC可用的間隔拍數。為優化性能,通常需要盡早判斷是否轉移,盡早確定轉移目標地址。
分支預測法的基本思想是預測轉移方向並執行該方向的指令,猜對時繼續執行后續指令,猜錯時回頭執行另一方向的上的指令。實現上,在IF段或ID段進行預測,猜對時不寫PC,猜錯時清空流水線,即各段都寫入氣泡。通常在猜對時停頓時長為0拍或1拍,猜錯時比阻塞法多停一拍。
延遲分支法的基本思想是將分支指令提前。維護一個延遲槽,即延遲分支之后必須要執行的指令,既然如此,盡可能在其中放入有用的指令。實現時,通常通過編譯階段重排序指令序列來完成。通常在延遲槽大小為1條指令時使用延遲分支,否則更適合用分支預測。
3. 流水線的實現
流水線實現基於多周期數據通路,其工作周期為n個時鍾周期,Tc為各個基本操作時長的最大值。相比單周期數據通路,多周期數據通路支持部件服用,並增設了一些附加寄存器。
流水線數據通路在實現時,為處理結構冒險,不允許部件復用,並要求固定使用時間;為實現操作分離,設置段間寄存器;為處理數據冒險,增設檢測邏輯和轉發線路。為處理控制冒險,需要設置從對應段寫PC的線路。
流水線控制器需要在ID段產生當前指令所需的微操作控制信號,此時冒險處理已經融入其中。各段只需使用並向后傳遞控制信號。
