將占整個處理50%的部分加快為4倍。整體的加速比是多少(阿姆達爾定律)?
- A2倍
- B1.6倍
- C4倍
查看答案與解析
正確答案:B. 1.6倍
改善後的時間,是未加速的其餘50%(0.5)與加快4倍的50%(0.5÷4 = 0.125)的總和,為0.625。加速比為1÷0.625 = 1.6倍。無論把加速的部分再加快多少,其餘的50%依然存在,所以整體最多也只能到2倍。要大幅加快整體,必須找出占用大量時間的部分來改善。
輸入程式中可平行執行的比例與處理器(核心)數,即可依阿姆達爾定律看出整個程式能加速多少。雙對數圖表會將這種問題規模固定時的上限,與問題規模隨處理器數增加的古斯塔夫森觀點加以比較。
細虛線為理想的線性加速(N 倍),藍線為阿姆達爾定律,綠線為古斯塔夫森定律。兩軸皆為對數刻度。未包含通訊、同步及負載不均所造成的額外負擔,因此實際加速比通常較低。
其他輸入維持目前的值,只讓選擇的輸入在目前值的 1/4 到 4 倍之間變化時的結果。紅點是目前的值。
將單一處理器的執行時間設為 1,可平行化的比例設為 p。使用 N 個處理器時,平行部分縮短為 p/N,但序列部分 (1 − p) 維持不變,因此加速比為 S = 1/((1 − p) + p/N)。無論 N 多大,序列部分都不會消失,所以加速比的上限為 1/(1 − p)。以預設值 p = 95%、N = 16 計算,S ≈ 9.14,上限為 20。僅僅 5% 的序列工作,就決定了程式最快能跑多快。
平行效率 E = S/N 表示每個處理器實際做了多少有用的工作。以預設值計算為 9.14 ÷ 16 ≈ 57.1%,代表超過 40% 的處理能力實際上處於閒置。在圖表中,藍線在 N 較小時沿著理想虛線上升,之後逐漸偏離並趨於平緩,逼近上限。維持 p = 95% 而將 N 提高到 64,S ≈ 15.4,效率只剩約 24%。效率開始急遽下降的位置,是判斷投入多少處理器才划算的實用依據。
阿姆達爾定律假設增加處理器時問題規模固定,稱為強擴展性。古斯塔夫森定律則讓問題規模隨處理器數增加,並在相同時間內求解,稱為弱擴展性,得到 S = (1 − p) + p·N。例如將模擬網格加密時,只有平行工作量增加,因此加速比幾乎與 N 成正比上升。請注意,這裡的 p 是在 N 個處理器上執行時量測的時間比例,與阿姆達爾定律中 p 的定義不同。
實際程式還會有執行緒啟動、資料通訊、在鎖與屏障處等待以及負載不均等額外負擔,因此實際加速比會低於阿姆達爾定律的預測。減少序列部分往往比增加核心更有效,所以一般做法是先進行效能剖析,再將熱點平行化。在 GPU 上,與主機之間的資料傳輸及核心函式(kernel)的啟動也相當於序列部分。在晶片設計中,結合少數高效能核心與大量小型核心,是同時加速工作負載中序列與平行部分的一種方式。
正確答案:B. 1.6倍
改善後的時間,是未加速的其餘50%(0.5)與加快4倍的50%(0.5÷4 = 0.125)的總和,為0.625。加速比為1÷0.625 = 1.6倍。無論把加速的部分再加快多少,其餘的50%依然存在,所以整體最多也只能到2倍。要大幅加快整體,必須找出占用大量時間的部分來改善。
正確答案:A. 優先加速花費大量時間的部分(常見情況)
即使把只占整體1%的部分加速到無限快,整體也只會變快約1%。相對地,若將占80%的部分加快2倍,整體約為1.7倍。因此基本作法是先用剖析器(profiler)等找出花費大量時間的部分,再從那裡開始改善。「加速常見情況」是電腦設計中也反覆使用的原則。
依阿姆達爾定律,上限為 1/(1 − 0.9) = 10 倍。即使使用 16 個處理器,加速比也只有 1/(0.1 + 0.9/16) = 6.4,效率為 40%。除非減少剩下 10% 的序列工作,否則加速比永遠無法超過 10。
不矛盾。阿姆達爾定律描述問題規模固定的強擴展性,古斯塔夫森定律則描述問題規模隨處理器數增加的弱擴展性。適用哪一種觀點,取決於你是想更快解決同一個問題,還是想在相同時間內解決更大的問題。
可以。當增加處理器使每個處理器分到的資料量小到足以放進快取時,記憶體存取會變快,可能出現超線性加速。阿姆達爾定律並未將這類效應納入模型。
阿姆達爾定律 古斯塔夫森定律(Gustafson's law) 加速比(Speedup) 平行效率(Parallel efficiency) 強擴展性(Strong scaling) 弱擴展性(Weak scaling)