處理器必須:提取指令、解譯指令、提取資料、處理資料、寫回資料。為此需要:ALU、控制單元、暫存器,以及內部匯流排把它們連起來。
暫存器組織
使用者可見暫存器:
通用暫存器(RV32I:x0–x31,其中 x0 恆為 0);
資料/位址暫存器(部分 ISA 分開;RISC-V 不分);
條件碼(旗標)——RISC-V 無。
控制與狀態暫存器:PC、IR、MAR、MBR;程式狀態字 PSW(旗標、特權模式、中斷致能……)。RISC-V 對應物是
mstatus等 CSR(第 21 章)。
設計議題:暫存器要幾個?(RISC 的答案:32 個——太少則頻繁溢出到記憶體,太多則編碼位元與脈絡切換成本上升);要多寬?(至少能裝一個位址)。
指令週期細化
指令週期可分解為更細的微操作序列(第 15 章),此處先建立五步觀點——這正是經典五級管線的由來:
| 階段 | 名稱 | 工作(以 RV32I 為例) |
|---|---|---|
| IF | 指令提取 | 從指令記憶體讀 M[PC];PC←PC+4 |
| ID | 解碼/讀暫存器 | 解析欄位;讀 rs1、rs2;產生立即值 |
| EX | 執行 | ALU 運算 / 位址計算 / 分支條件判定 |
| MEM | 記憶體存取 | 載入讀資料記憶體;儲存寫資料記憶體 |
| WB | 寫回 | 結果寫入 rd |
指令管線
裝配線思想
若每階段需 1 個時脈,循序執行每條指令需 5 週期。管線讓五個階段的硬體同時服務五條不同的指令:
定量模型
\(k\) 級管線、每級 \(\tau\)(含級間鎖存器延遲),執行 \(n\) 條指令:
\[T_{pipe} = [k + (n-1)]\,\tau, \qquad \text{加速比 } S = \frac{n k \tau}{[k+(n-1)]\tau} \xrightarrow{\;n\to\infty\;} k\]
理想情況下加速比趨近級數 \(k\)。但實際上:(1) 各級工作量不均,\(\tau\) 由最慢級決定;(2) 級間鎖存器有固定開銷;(3) 危障造成停頓。級數也非愈多愈好——控制邏輯與鎖存開銷隨級數成長,且分支代價變大。
管線危障
結構危障(資源衝突)
兩條指令同週期爭用同一硬體。經典例:IF 要讀指令記憶體、MEM 要讀資料記憶體——若指令與資料共用單一記憶體埠就衝突。對策:分離的指令/資料快取(哈佛結構,第 4 章)、多埠暫存器檔(2 讀 1 寫)。
資料危障
後指令依賴前指令尚未寫回的結果(RAW,讀在寫後——管線中最主要者):
add x5, x6, x7 # x5 在第 5 週期 (WB) 才寫回
sub x8, x5, x9 # 但第 3 週期 (ID) 就要讀 x5!
對策(細節與實作見第 25 章):
停頓(stall):插入氣泡等待——簡單但慢;
前遞(forwarding/bypassing):EX 的輸出直接繞回 EX 的輸入,多數 RAW 零代價;
載入—使用危障:
lw的資料 MEM 級才有,緊接著用的指令必須停 1 拍(前遞也救不了),或由編譯器排程填充。
控制危障(分支)
分支結果在 EX 級才知道,但下一拍就要提取下一條指令——提取誰?猜錯就得沖銷(flush)已進入管線的指令。分支在程式中約占 15–25%,是管線效能的頭號敵人。
對策綜覽
多重指令流:兩路都抓(硬體加倍,合流再選);
提前判定:把分支比較移到 ID 級,縮短代價;
延遲分支:分支後固定執行 1 條(delay slot;MIPS 採用,RISC-V 拒絕——它把微結構細節漏進 ISA);
靜態預測:一律猜不跳/一律猜跳/向後跳猜跳(迴圈友善);
動態預測:分支歷史表(BHT)以 2 位元飽和計數器記錄近期行為;分支目標緩衝器(BTB)記住目標位址,IF 級即可改向。現代預測器(TAGE、感知器)正確率 \(>\)97%。
狀態:強不跳 00 ↔︎ 弱不跳 01 ↔︎ 弱跳 10 ↔︎ 強跳 11;每次實際結果向對應方向推一格,預測看最高位。比 1 位元預測器好在:迴圈最後一次的「例外」不會立刻推翻整體傾向,典型迴圈每輪只誤預測一次。
效能公式:\(\mathrm{CPI} = 1 + \text{每指令平均停頓週期}\)。管線不減少單條指令的延遲(反而略增),它提升的是吞吐量。危障處理的所有技巧,都是在把「平均停頓」壓向零。
本章重點回顧
五級管線 IF-ID-EX-MEM-WB;理想加速比 = 級數,實際受不均勻分級、鎖存開銷與危障限制。
結構危障:資源不夠 → 分離 I/D 快取、多埠暫存器檔。
資料危障(RAW):前遞解決大多數;載入—使用必須停 1 拍。
控制危障:靜態/動態分支預測;BHT(方向)+BTB(目標);RISC-V 無延遲槽。
CPI = 1 + 平均停頓;管線提升吞吐量而非單指令延遲。
複習問題
4 級管線、每級 1 ns、執行 1000 條指令:求管線與非管線時間及加速比。
為何管線級數不是愈多愈好?列出兩個原因。
指出下列程式的危障類型與位置,並說明前遞能否消除:
lw x5,0(x6); add x7,x5,x8; sub x9,x7,x5。分支占 20%、猜錯率 10%、猜錯代價 2 週期:求 CPI。
2 位元預測器對「跳 9 次、不跳 1 次」循環的長期誤預測率是多少?1 位元預測器呢?
RISC-V 為何不採延遲分支?從 ISA 長壽性論述。
9 W. Stallings, Computer Organization and Architecture, 6th ed., Chapter 12. D. A. Patterson and J. L. Hennessy, Computer Organization and Design, RISC-V Edition, 2nd ed., Morgan Kaufmann, 2021, Ch. 4.