第三章 指令級并行 (Instruction-Level Parallelism, ILP)
一、 基本概念
1. 指令級并行 (ILP):指在單個處理器內,通過硬件或軟件技術,使得多條指令在執行階段可以重疊進行,從而提高程序執行速度。其核心思想是挖掘和利用程序中指令之間潛在的并行性。
2. 關鍵度量:
* 并行度:平均每個時鐘周期可以執行的指令數。
- 主要目標:使 CPI (Clock Cycles Per Instruction) 盡可能接近1甚至小于1。
- 限制ILP的因素:
- 數據相關 (Data Hazard):真數據相關(寫后讀,RAW)限制了指令的執行順序。
- 名字相關 (Name Hazard):反相關(寫后寫,WAW)和輸出相關(讀后寫,WAR),可通過寄存器重命名解決。
- 控制相關 (Control Hazard):由分支指令引起,影響指令的取指順序。
- 結構沖突 (Structural Hazard):硬件資源沖突。
二、 基于硬件的動態調度技術
- 記分板算法 (Scoreboarding)
- 目標:在保持數據流和異常行為的前提下,允許指令亂序執行(Out-of-Order Execution)。
- 核心思想:中央控制器(記分板)跟蹤所有指令的狀態、數據相關性和資源使用情況。指令在譯碼后進入記分板,當操作數就緒且功能單元可用時,記分板才發射該指令執行。
- 執行階段:分為4段:
- 發射 (Issue):檢查結構沖突與WAW相關。
- 讀操作數 (Read Operands):等待數據相關消除(即源操作數就緒)。
- 執行 (Execution):在功能單元中計算。
- 寫回 (Write Back):結果寫回寄存器。
- 缺點:檢測和解決所有相關,硬件復雜;無法處理WAR和WAW相關(通過停頓解決,影響效率)。
- Tomasulo算法
- 核心改進:
- 分布式控制:通過保留站(Reservation Station)進行指令調度,而非中央記分板。
- 寄存器重命名:使用保留站和公共數據總線(CDB)實現,徹底消除WAR和WAW相關。
- 前瞻執行:為處理控制相關(分支)奠定基礎。
- 主要部件與流程:
- 保留站:緩存已發射但未執行的指令及其操作數(或指向操作數的指針)。
- 公共數據總線:廣播結果,實現數據前遞(Forwarding)。
- 流程:發射 -> 執行 -> 寫回。在“發射”階段,若操作數未就緒,則從寄存器或CDB獲取“標簽”,實現寄存器重命名。
- 優勢:能高效處理數據相關,支持亂序執行,為后續的分支預測和推測執行提供了硬件基礎。
三、 基于硬件的分支預測與推測執行
- 分支預測 (Branch Prediction)
- 動機:減少控制相關帶來的流水線停頓。
- 靜態分支預測:編譯時確定,如“總是預測不跳轉”、“向后跳轉預測跳轉”等。簡單但準確率有限。
- 動態分支預測:運行時根據歷史信息進行預測。
- 分支歷史表 (BHT):使用分支指令地址的低位索引一個表,表中記錄上次執行的結果(跳轉/不跳轉)。
- 兩位飽和計數器:提高預測準確性,需兩次預測錯誤才會改變預測方向,具有良好的穩定性。
- 分支目標緩沖器 (BTB):緩存預測跳轉的分支指令的目標地址,可在取指階段直接提供目標指令地址。
- 相關分支預測器 (如兩位局部/全局歷史預測器):利用分支之間的相關性(模式)進行更精確的預測。
- 推測執行 (Speculative Execution)
- 概念:基于分支預測的結果,在分支指令結果確定之前,提前執行預測路徑上的指令。
- 硬件支持(結合Tomasulo算法):
- 重排序緩沖器 (ROB):核心組件。按程序順序緩存所有推測執行的指令及其結果。
- 流程:指令按序發射到ROB和保留站,亂序執行,但結果先寫入ROB,并不立即更新寄存器。只有當指令在ROB中變為最舊的、且非推測狀態時,才按序提交結果到寄存器或內存。
- 異常處理:在推測執行期間發生的異常被記錄在ROB中,只有在該指令提交時才真正處理,保證了異常行為的精確性。
- 錯誤預測恢復:當分支預測錯誤時,清空該分支之后的所有推測執行指令(清空ROB和保留站相關項),并從正確路徑重新取指。
四、 基于軟件的靜態調度技術(由編譯器完成)
- 循環展開 (Loop Unrolling)
- 將循環體復制多次,減少循環控制指令(如分支、自增)的開銷,為編譯器調度創造更多指令,以填充延遲槽。
- 需注意寄存器壓力增加和代碼膨脹問題。
- 指令調度 (Instruction Scheduling)
- 編譯器通過調整指令順序,盡可能分離存在數據相關的指令,以填充因數據相關或功能單元延遲導致的流水線氣泡。
- 常用方法:靜態調度、軟流水線 (Software Pipelining) 等。
- 靜態多發射處理器與VLIW
- 靜態多發射:處理器每個時鐘周期發射固定數量的指令包,依賴編譯器在編譯時挖掘ILP,并將指令打包,硬件相對簡單。
- 超長指令字 (VLIW):靜態多發射的典型代表。一條“超長指令”包含多個獨立操作字段,編譯器負責調度和打包,硬件無需復雜的動態調度邏輯。
- 挑戰:對編譯器要求極高;二進制代碼兼容性差;難以處理緩存缺失等動態事件。
五、 多發射處理器
1. 超標量處理器 (Superscalar):每個時鐘周期動態發射可變數量的指令(如1-8條),依賴硬件(如Tomasulo)進行動態調度、相關檢測和亂序執行。這是現代通用CPU的主流技術。
2. 超流水線處理器 (Superpipelining):將流水線劃分成更多、更細的階段,通過提高主頻來提升性能,屬于時間并行。常與超標量技術結合使用。
本章小結
指令級并行是提升單處理器性能的核心技術。主要途徑包括:
- 硬件動態方法:通過記分板、Tomasulo算法實現亂序執行;結合分支預測和推測執行(ROB)克服控制相關。
- 軟件靜態方法:通過編譯器進行循環展開、指令調度,服務于靜態多發射/VLIW架構。
- 現代高性能處理器(如Intel/AMD的CPU)普遍采用動態調度的超標量結構,并結合強大的分支預測和推測執行技術,以挖掘程序中的指令級并行。