管線化與危障
管線危障(pipeline hazard)
裝配線只有在每籃衣服彼此獨立、每台機器在你需要時都空著時,才會運作得漂亮。麻煩起於:摺衣站需要一件烘乾機還沒烘好的襯衫,或兩籃衣服在同一分鐘都要用唯一那台烘乾機,或你還不知道某籃到底要不要洗,因為有人還沒決定。管線危障就是任何這類情況:一條指令因為與管線中另一條指令衝突,而無法在它排定的週期前進。
危障恰好分三種口味,而這個領域接下來基本上就是巡覽它們及其解法。結構危障是兩條指令在同一週期想要同一個硬體資源——例如都要用唯一那個記憶體埠。資料危障是一條指令需要一個值,而較早、仍在飛行中的指令還沒產生出來——答案算好了卻還沒寫回。控制危障(分支危障)是還不知道下一條指令是哪一條,因為某個分支的結果還在判定中,而我們本該已經在提取後續指令了。
危障正是理想的 k 倍加速永遠搆不到的原因。對任何危障最粗暴的解法是停頓——凍結管線前端,插入什麼都不做的氣泡,直到衝突解除——但停頓浪費週期。管線設計中大部分的巧思,都在於避免停頓:提早前饋結果以閃過大多數資料危障、複製資源以消除結構危障、預測分支以隱藏控制危障。理解危障,正是理解真實處理器為何達不到紙上峰值的核心。
三行裡的三種危障。lw x1, 0(x2) 接著 add x3, x1, x4——資料危障,因為 add 在 lw 寫好 x1 之前就要用它。一條分支 beq x1, x2, L 接著下一次提取——控制危障,因為我們還不知道會不會跳。兩條指令在一個週期都要存取記憶體——結構危障。
三大危障家族——結構、資料、控制——各自以不同的原因打破順暢的重疊。
危障是正確性問題,不只是速度問題:若管線無視它、讓一條指令讀到過時的值,程式就會算出錯誤答案。解法必須先保住正確結果,再盡量減少損失的週期。
又称
另见