管線化與危障

理想的管線加速比(pipeline speedup)

這是管線化誘人的承諾:把工作切成 k 個階段,你就快 k 倍。五個階段,五倍吞吐量。聽起來像天上掉錢。誠實的版本是:k 是你能逼近卻永遠搆不到的天花板,而好幾個現實摩擦會把你壓在它之下。

理想的算式很簡單。若非管線化的工作要花時間 T,你把它切成 k 個相等的階段,每階段花 T/k,於是管線一旦填滿,每 T/k 就完成一條指令——加速 k 倍。但有三件事會吃掉它。第一,各階段從來不會完全相等:最慢的階段決定時脈,所以若某個階段比其他胖,你就在其他階段浪費時間。第二,每個階段都多了一段管線暫存器的延遲,所以週期比 T/k 略長。第三,也是最重要的,管線必須先填滿(第一條指令在任何吞吐量出現之前,仍要花足整段延遲),而且每當危障打斷順暢的流動,它就會停頓。

所以實際的加速比是 k 除以一個懲罰:大致為 加速比 = k /(1 + 每條指令的停頓數),在計入填充時間與不均勻的階段之後。對一支長程式,填充時間可忽略,但危障不可——一段充斥分支與相依載入的指令流,可能跑得遠不到理想的一半。這就是為什麼單純加階段並不會持續讓效能翻倍:每多一階都買到更快的時脈,卻抬高了每次停頓與誤測的代價。藝術在於讓生產線繼續前進,而不只是把它拉長。

一條 5 階段管線跑 1000 條指令:理想 5 倍。但假設每 5 條中有 1 條造成 1 週期停頓,每條多 0.2 個停頓週期。實際加速比約為 5 /(1 + 0.2)= 4.17 倍——光這項就已損失五分之一的理想,還沒算進填充時間與不均勻的階段。

k 倍的承諾是個天花板;停頓、填充時間與不均勻的階段,意味著真實加速比總是不及階段數。

切忌把階段數當成加速比。20 階段的管線不會比 1 階段快 20 倍;危障與填充成本隨深度增加,而 Amdahl 式的限制也適用於無法重疊的那部分工作。

又称
pipeline speedupideal speedup管線加速比