阿姆達爾定律(Amdahl's law)
/ Amdahl -> AM-dahl /
假設一件工作要十小時,其中九小時能拆給你想要多少就多少的工人,但有一小時是單一任務,只能一個人從頭做到尾。雇一千個工人,那九小時平行部分縮到幾乎沒有——但那頑固的一小時還在。所以整件工作永遠低不過一小時,至多 10 倍加速,無論你投入多少工人。那道硬性天花板就是阿姆達爾定律,也是平行計算中最發人深省的事實。
精確地說:若一個程式的工作中有比例 s 是天生序列的(無法平行化),其餘比例 1 - s 能完美平行到 p 個處理器上,則加速比為 S(p) = 1 / (s + (1 - s) / p)。當 p 增到無窮,平行部分消失,加速比封頂於 1 / s。所以若你的執行時間只有 5% 是序列的(s = 0.05),你能拿到的至多是 20 倍加速——即使有無窮多核心。1% 序列時,天花板是 100 倍。序列比例無論多小,都立起一堵你靠加硬體爬不過去的牆;更糟的是,報酬遞減很早就咬人——在 s = 0.05 的程式上從 100 核加到 1000 核,幾乎動不了指針。
阿姆達爾定律正是「什麼都平行化」很天真的原因,也是效能分析要緊的原因:平行化的回報由你最糟的序列瓶頸決定,故最有價值的工作往往是消除或縮小那序列比例,而非加核心。它也解釋一種真實的挫折——一段程式在 16 核達 8 倍、在 64 核卻持平於 10 倍。有一個樂觀的對照,古斯塔夫森定律:實務上人們不會固定問題規模;他們在更大的機器上跑更大的問題,而問題增長時平行部分通常比序列部分長得更快,故有效序列比例縮小、大幅加速仍可企及。阿姆達爾界定固定規模(強)擴展;古斯塔夫森拯救增長(弱)擴展。
一個程式 95% 可平行、5% 序列。在 16 核上:S = 1 / (0.05 + 0.95/16) = 1 / 0.109 = 約 9.1 倍。在 64 核上:1 / (0.05 + 0.95/64) = 約 15.4 倍。在無窮核上:1 / 0.05 = 20 倍。把核心從 16 翻四倍到 64,只把加速比從 9 倍抬到 15 倍,而那硬性的 20 倍天花板逃不掉。
加速比 S(p) = 1/(s + (1-s)/p),封頂於 1/s——5% 的序列部分永遠把你限在 20 倍。
阿姆達爾定律假設固定的問題規模、且忽略平行化的開銷(通訊、同步),所以它是樂觀的上界——真實加速通常更差。它的解救者古斯塔夫森定律,只在你確實隨機器把問題放大時適用;在固定問題上,那道序列牆是真的。