管線化與危障
管線中的吞吐量與延遲
想像一座有長隧道的洗車場。開過隧道要十分鐘,無論隧道空或滿,這十分鐘都一樣。那就是延遲——一輛車從入口到出口要花多久。但如果隧道裡同時有十輛車,而每分鐘可以進來一輛新車,洗車場就每分鐘完成一輛。這個速率——每分鐘完成幾輛車——就是吞吐量。這兩個數字不一樣,而管線會改善其中一個卻不改善另一個。
延遲是一條指令從開始到結束所花的時間;吞吐量是完成的指令從末端冒出來的速率。在非管線化的機器裡,延遲與吞吐量綁在一起:若一條指令要 5 奈秒,你每 5 奈秒完成一條。管線切斷了這層綁定。把 5 奈秒切成五個 1 奈秒的階段:每條指令通過仍然約要 5 奈秒(延遲不變,甚至略增),但管線一旦填滿,每 1 奈秒就完成一條新指令。吞吐量大約提升五倍,延遲卻原地不動。
初學者必須同時握住這兩個概念,因為它們回答不同的問題。如果你在意的是某個答案多快能備妥——例如一條後續指令正在等的關鍵指令——那是延遲說了算,而管線對那件事沒幫助。如果你在意的是每秒總共做多少工作——一長串彼此獨立的指令——那是吞吐量說了算,管線就是大勝。真實程式通常跑的是長串工作,這就是管線划算的原因;但一連串彼此相依的指令會暴露延遲、讓管線停頓。
非管線化:每條指令 = 5 奈秒,所以延遲 5 奈秒、吞吐量為每 5 奈秒一條 = 每奈秒 0.2 條。管線化成五個 1 奈秒階段:延遲仍約 5 奈秒,但管線填滿後吞吐量升到每奈秒一條——吞吐量提升 5 倍,延遲卻沒提升。
每條指令的總工作量相同,但攤在重疊的階段上:完成的速率飆升,而任一指令的時間維持不變。
不要把延遲與吞吐量平均成一個「速度」數字。管線可以有極佳的吞吐量,卻仍讓相依的指令等足整段延遲——這正是資料危障會傷人的原因。
又稱
另見