多核心、一致性與執行緒層級平行

Amdahl 定律(Amdahl's law)

/ AM-dahls /

假設一趟公路旅行是 100 小時:90 小時的開闊高速公路,多一點馬力有幫助,加上 10 小時困在市區車陣裡,馬力沒用。如果你買一具無限快的引擎,你抹掉了那 90 小時高速公路,但那 10 小時市區仍在——所以這趟旅行永遠不可能低於 10 小時,不論你花多少錢。Amdahl 定律(Amdahl's law)就是平行運算的這道硬天花板:程式中必須循序執行的部分,為總時間設下一個地板,所以加核心只能加速那個能平行的部分,永遠加速不了其餘。

用數字說。設 f 是工作中天生循序的比例(必須在一個核心上跑),於是 1 - f 是可平行化的比例。有 N 個核心時,平行部分在它原本時間的 (1 - f)/N 內完成,而循序部分維持在 f。所以加速比是 1 / (f + (1 - f)/N)。現在讓 N 趨近無限:(1 - f)/N 項消失,加速比趨近 1/f。若程式只有 10% 是循序的(f = 0.1),最大可能加速是 1/0.1 = 10 倍——即使有一百萬個核心。區區 5% 的循序就把你封頂在 20 倍。是循序比例、而非核心數,當家作主。

這是多核心時代那條發人深省的定律,也是對「就多加幾個核心」的誠實反駁。它解釋了為什麼朝問題猛丟核心會收益遞減,以及為什麼循序瓶頸——啟動、最後的歸約、加鎖、輸入輸出——才是優化心力划算之處。有一個重要的對位,Gustafson 定律:實務上人們會把問題放大以配合機器(在更多核心上跑更大的模擬),對於這種放大的工作負載,循序比例相對於成長的平行工作而縮小,所以大幅加速仍可達成。兩者都對——Amdahl 框住固定問題、Gustafson 描述成長中的問題——而哪個適用,取決於你的工作負載是固定大小還是可擴展的。

一個程式 95% 可平行化、5% 循序(f = 0.05)。用 10 個核心,加速比 = 1 / (0.05 + 0.95/10) = 1 / 0.145 ≈ 6.9 倍。用 100 個核心,= 1 / (0.05 + 0.95/100) ≈ 16.8 倍。用無限個核心,天花板是 1/0.05 = 20 倍。從 10 個核心增到 100 個(十倍硬體),只多買到約 2.4 倍的速度。

即使極小的循序比例也把加速比狠狠封頂,且收益迅速遞減——這就是為什麼更多核心很少意味著按比例更多的效能。

Amdahl 定律假設問題大小固定。Gustafson 定律是對放大工作負載的對位——讓問題隨機器成長,循序比例縮小,大幅加速仍可能。兩者都不讓「加核心、得按比例的速度」成真。

又称
Amdahl's argumentlaw of diminishing parallel returns阿姆達爾定律