效能工程

阿姆達爾定律與古斯塔夫森定律

/ AHM-dahlz; GUS-taf-sunz /

假設一件工作要 10 小時,你發現其中 9 小時可以分給許多工人,但有 1 小時就是無法平行化(必須由一名工人從頭做到尾)。即使有無限多工人,這件工作也永遠無法低於那 1 小時——串列部分是一道地板。那道地板正是阿姆達爾定律的核心,也是「多丟核心給一個問題」為何如此常令人失望的原因。

阿姆達爾定律,平白地說:若工作中有比例 p 可平行化、剩下的串列比例 s = 1 - p,那麼在 N 個處理器下最好的加速是 1 / (s + p/N)。當 N 變大,p/N 這項朝零縮小,所以加速趨近 1/s,一道完全由串列比例決定的硬天花板——若有 5% 是串列(s = 0.05),無論你買多少核心都永遠快不過 20 倍。阿姆達爾的玄機在於它把「問題大小固定」,問你能多快完成同一份工作。古斯塔夫森定律則為常見的真實情況重新框定問題,那情況是更多運算讓你在相同時間內處理「更大」的問題:若你隨機器把工作量也放大,串列部分大致不變而平行部分變大,所以可達成的縮放加速是 s + p x N,它隨 N 幾乎線性成長。兩者都對,它們回答不同的問題。阿姆達爾:「工作固定,我能早多少完成?」——悲觀、受天花板束縛。古斯塔夫森:「時間固定,我能多做多少工作?」——樂觀、利於縮放。

它之所以重要,是因為它在你花錢買核心之前,告訴你平行化能買到什麼、不能買到什麼。誠實的警告:真實的加速通常比阿姆達爾預測的「還要差」,因為平行化加入了它自己的額外負擔——同步、通訊、爭用、負載不均——這些公式都忽略了。而那個「串列比例」並非自然固定:往往最大的勝利不是加核心,而是靠移除一個串列瓶頸(一個全域鎖、一個循序的 I/O 階段)來縮小 s。在假設 N 個核心給你 N 倍之前,先量你實際的串列比例。

串列比例 s = 0.05(5%),平行 p = 0.95。 阿姆達爾,N=8:加速 = 1 / (0.05 + 0.95/8) = 5.9 倍(不是 8 倍) 阿姆達爾,N=無限:加速 -> 1/0.05 = 20 倍(硬天花板) 古斯塔夫森,N=8(把問題放大):加速 = 0.05 + 0.95*8 = 7.65 倍

同樣 5% 的串列比例,兩個問題:阿姆達爾把固定大小的加速封頂在 20 倍;古斯塔夫森放大問題,幾乎線性成長。

阿姆達爾與古斯塔夫森並不矛盾——它們固定的是不同的東西(問題大小對時間)。兩者都忽略真實的平行額外負擔,所以實測加速通常低於任一個;而且縮小串列比例往往勝過加核心。

又稱
Amdahl's lawGustafson's lawthe serial-fraction ceilingspeedup limits串列比例上限