流水線原理
對於一條具體的指令執行過程,通常可以分為五個部分:取指令,指令譯碼,取操作數,運算,寫結果.其中前三步一般由指令控制器完成,后兩步則由運算器完成
若采用順序執行的方式, 則執行前三步時運算器空閑, 執行后兩步時指令控制器空閑.
流水線技術的基本原理是: 指令控制器完成了對第一條指令的處理后, 不等待運算器完成后續的處理直接開始對第二條指令的處理.這里的指令控制器和運算器只是對參與指令處理的部件的舉例.
時空圖是對處理狀態的圖形描述, 橫坐標為時間, 縱坐標離散為處理的階段(表示對處理部件的占用, 即空間).每一塊代表某一指令的某一處理階段, 標有同一序號的各階段的塊表示某一指令的處理流程.
各階段等時長的時空圖:

各階段不等時長的時空圖:

吞吐率TP是衡量處理能力的主要指標, 其含義為單位時間內處理的指令數.
對單指令流水線而言,最大吞吐率\(TP_{max}\)為處理過程中用時最長階段單次耗時的倒數.
實際吞吐率則根據定義來計算.
由時空圖我們可以計算出處理n條指令所花費的時間T, 並可以計算出采用順序處理消耗的時間\(T_{順}\).
定義加速比\(S = \frac{T_{順}}{T}\).
提高流水線性能
瓶頸
瓶頸是指處理時間較長的處理階段, 從上面各階段不等長的時空圖可以看出這些處理階段使得后續階段需要等待其完成浪費了處理時間.
對於瓶頸階段的解決方案可以采用將瓶頸階段拆分為多個較短的處理階段,或者采用多個處理部件並行處理.
將瓶頸階段拆分后單指令處理時間未變, 但是多條指令總體處理時間縮短.

相關
相關是指流水線處理過程中相鄰或相近的任務之間存在依賴制約關系.相關將會降低流水線的處理效率,因此, 需要采取措施避免相關性帶來的損害.
相關性分為幾類:
-
結構相關: 並行執行的指令需要占用同一硬件資源產生沖突.
-
數據相關: 處理的某一階段需要等待上一階段的結果產生數據相關, 如上文瓶頸階段
-
控制相關: 當流水線執行條件轉移等指令時產生控制相關.
處理控制相關的方法除了上文提到的對瓶頸的處理外還有定向和互鎖硬件.
定向設備是流水線段之間直接的連通同路,又稱旁路或短路.
流水線互鎖硬件在發現存在數據相關時先讓流水線暫停工作,直到數據相關消失為止.
條件轉移指令導致已經進入流水線的指令不再執行, 需要將轉移目標處的指令重新加入流水線中,降低效率.
處理控制相關的主要思路是分支預測,分支預測分為靜態預測和動態預測兩種.
靜態預測比較重要的方法是編譯器預測,比如對於一個循環,編譯器認為繼續循環比跳出循環的概率要大.
動態分支預測的一種方法是采用分支歷史表, 通過一或兩個標志位記錄該分支處歷史信息,用於預測分支.
分支目標緩沖器則是存儲歷史跳轉目標, 若當前條件與歷史吻合時則用歷史記錄進行跳轉.
延遲分支是分支預測之外的另一種處理方法, 它利用編譯器對指令重排, 通過插入空指令或有用指令盡量使流水線處於充滿狀態.
將分支指令延遲為長度為n的分支指令,其后緊跟n個分支延遲槽, 利用延遲槽中的指令掩蓋必須插入的停頓周期, 減少分支開銷.
中斷
中斷分為內部中斷和外部中斷,內部中斷主要是異常處理中斷,外部中斷則類型很多發生比較隨機,如IO中斷.
斷點分為不精確斷點和精確斷點.不精確斷點的處理機制是禁止新的指令進入流水線,已進入的指令執行完畢后流水線中斷.
除了中斷位置不精確外,如果是異常中斷不精確斷點會使異常指令繼續執行容易產生錯誤結果.
精確斷點則是立即中斷, 流水線中現場信息全部保留下來以便在中斷返回后恢復現場.
其它
提高流水線深度(段數)是經典的加速方法, 但也伴隨着許多問題.現在有很多新技術用於加速處理.
指令調度是在一段程序中重新排序指令,使得程序中相關指令盡可能消除.
亂序執行則采用跳過相關指令,先執行不相關指令的方法加速.
超標量處理機基於重復硬件運行多條流水線,使得在一個時鍾周期內可以發射或流出多條指令.
超流水線處理機將階段更加細分, 級數大於等於8級的流水線稱為超流水線.
超長指令字是把不相關的多條指令組合在一起作為一條位數超長的指令一同發射到流水線中,並行執行.
