摘要:阿姆達爾定律定律是計算機科學中非常重要的定律。它定義了串行系統并行化后的加速比的計算公式和理論上線。需要從根本上修改程序的串行行為,提高系統內可并行化的模塊比重,在此基礎上,合理增加并行處理器數量,才能以最小的投入,得到最大的加速比。
有關為什么要使用并行程序的問題前面已經進行了簡單的探討。總的來說,最重要的應該是處于兩個目的。
第一,為了獲得更好的性能;
第二,由于業務模型的需要,確實需要多個執行實體。
在這里,我將更加關注第一種情況,也就是有關性能的問題。將串行程序改造為并發程序,一般來說可以提高程序的整體性能,但是究竟能提高多少,甚至說究竟是否真的可以提高,還是一個需要研究的問題。目前,主要有兩個定律對這個問題進行解答,一個是Amdahl定律,另外一個是Gustafson定律。
Amdahl(阿姆達爾)定律Amdahl定律是計算機科學中非常重要的定律。它定義了串行系統并行化后的加速比的計算公式和理論上線。
加速比定義:加速比 = 優化前系統耗時 / 優化后系統耗時
所謂加速比就是優化前耗時與優化后耗時的比值。加速比越高,表明優化效果越明顯。圖1.8顯示了Amdahl公式的推到過程,其中n表示處理器個數,T表示時間,T1表示優化前耗時(也就是只有1個處理器時的耗時),Tn表示使用n個處理器優化后的耗時。F是程序中只能串行執行的比例。
根據這個公式,如果CPU處理器數量趨于無窮,那么加速比與系統的串行化比例成反比,如果系統中必須有50%的代碼串行執行,那么系統的最大加速比為2。
假設有一個程序分為以下步驟執行,每個執行步驟花費100個單位時間。其中,只有步驟2和步驟5可以并行,步驟1、3、4必須串行,如圖1.9所示。在全串行的情況下,系統合計耗時為500個單位時間。
若步驟2和步驟5并行化,假設在雙核處理器上,則有如圖1.10所示的處理流程。在這種情況下,步驟2和步驟5的耗時將為50個單位時間。故系統整體耗時為400個單位時間。根據加速比的定義有:
加速比 = 優化前系統耗時 / 優化后系統耗時 = 500/400 = 1.25
由于5個步驟中,3個步驟必須串行,因此其串行化比例為3/5=0.6,即 F = 0.6,且雙核處理器的處理器個數N為2。代入加速比公式得:
加速比 = 1/(0.6+(1-0.6)/2)=1.25
在極端情況下,假設并行處理器個數為無窮大,則有如圖1.11所示的處理過程。步驟2和步驟5的處理時間趨于0。即使這樣,系統整體耗時依然大于300個單位時間。使用加速比計算公式,N趨于無窮大,有加速比 = 1/F,且F=0.6,故有加速比=1.67。即加速比的極限為500/300=1.67。
由此可見,為了提高系統的速度,僅增加CPU處理的數量并不一定能起到有效的作用。需要從根本上修改程序的串行行為,提高系統內可并行化的模塊比重,在此基礎上,合理增加并行處理器數量,才能以最小的投入,得到最大的加速比。
注意:根據Amdahl定律,使用多核CPU對系統進行優化,優化的效果取決于CPU的數量,以及系統中串行化程序的比例。CPU數量越多,串行化比例越低,則優化效果越好。僅提高CPU數量而不降低程序的串行化比例,也無法提高系統的性能。
阿姆達爾定律圖示為了更好地理解阿姆達爾定律,我會嘗試演示這個定定律是如何誕生的。
首先,一個程序可以被分割為兩部分,一部分為不可并行部分B,一部分為可并行部分1 – B。如下圖:
在頂部被帶有分割線的那條直線代表總時間 T(1)。
下面你可以看到在并行因子為2的情況下的執行時間:
并行因子為3的情況:
舉個例子
一個業務會串行調用2個方法,m1,m2,m1耗時100ms,m2耗時400ms,m2內部串行執行了4個無依賴的任務,每個任務100ms,如下圖:
m2內部的4個任務無依賴的,即可以并行進行處理,4個任務同時并行,當cpu數量大于等于4的時候,可以讓4個任務同時進行,此時m2耗時最小,即100ms,cpu為2個的時候,同時只能夠執行2個任務,其他2個任務處于等待cpu分配時間片狀態,此時m2耗時200ms;當cpu超過4個的時候,或者趨于無限大的時候,m2耗時還是100ms,此時cpu數量再怎么增加對性能也沒有提升了,此時需要提升的是任務可以并行的數量。
從阿姆達爾定律可以看出,程序的可并行化部分可以通過使用更多的硬件(更多的線程或CPU)運行更快。對于不可并行化的部分,只能通過優化代碼來達到提速的目的。因此,你可以通過優化不可并行化部分來提高你的程序的運行速度和并行能力。你可以對不可并行化在算法上做一點改動,如果有可能,你也可以把一些移到可并行化放的部分。
Gustafson定律Gustafson定律也試圖說明處理器個數、串行化比例和加速比之間的關系,如圖1.12所示,但是Gustafson定律和Amdahl定律的角度不同。同樣,加速比都被定義為優化前的系統耗時除以優化后的系統耗時。
根據Gustafson定律,我們可以更容易地發現,如果串行化比例很小,并行化比例很大,那么加速比就是處理器的個數。只要不斷地累加處理器,就能獲得更快的速度。
Amdahl定律和Gustafson定律結論有所不同,并不是說其中有個是錯誤的,只是二者從不同的角度去看待問題的結果,他們的側重點有所不同。
Amdahl強調:當串行換比例一定時,加速比是有上限的,不管你堆疊多少個CPU參與計算,都不能突破這個上限。
Gustafson定律關系的是:如果可被并行化的代碼所占比例足夠大,那么加速比就能隨著CPU的數量線性增長。
總的來說,提升性能的方法?:想辦法提升系統并行的比例,同時增加CPU數量。
喜歡就關注我吧文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75907.html
摘要:方法由兩個參數,表示期望的值,表示要給設置的新值。操作包含三個操作數內存位置預期原值和新值。如果處的值尚未同時更改,則操作成功。中就使用了這樣的操作。上面操作還有一點是將事務范圍縮小了,也提升了系統并發處理的性能。 這是java高并發系列第21篇文章。 本文主要內容 從網站計數器實現中一步步引出CAS操作 介紹java中的CAS及CAS可能存在的問題 悲觀鎖和樂觀鎖的一些介紹及數據庫...
摘要:有三種狀態運行關閉終止。類類,提供了一系列工廠方法用于創建線程池,返回的線程池都實現了接口。線程池的大小一旦達到最大值就會保持不變,在提交新任務,任務將會進入等待隊列中等待。此線程池支持定時以及周期性執行任務的需求。 這是java高并發系列第19篇文章。 本文主要內容 介紹Executor框架相關內容 介紹Executor 介紹ExecutorService 介紹線程池ThreadP...
摘要:參考何去何從的并行計算忘記該死的并行并行程序的復雜性和亂序性,并行程序設計十分復雜。可怕的現實摩爾定律的失效單核上的晶體管數目達到極限。并發級別阻塞重入鎖無饑餓兩個線程優先級不同,低優先級的可能產生饑餓。 Chapter1 參考:https://github.com/chengbingh... 1.1何去何從的并行計算 1.1.1 忘記該死的并行并行程序的復雜性和亂序性,并行程序設計十...
摘要:我們需要先了解這些概念。在中,其表現在對于共享變量的某些操作,是不可分的,必須連續的完成。有序性有序性指的是程序按照代碼的先后順序執行。 JMM(java內存模型),由于并發程序要比串行程序復雜很多,其中一個重要原因是并發程序中數據訪問一致性和安全性將會受到嚴重挑戰。如何保證一個線程可以看到正確的數據呢?這個問題看起來很白癡。對于串行程序來說,根本就是小菜一碟,如果你讀取一個變量,這個...
閱讀 3056·2021-09-22 15:59
閱讀 1310·2021-08-30 09:46
閱讀 2272·2019-08-30 15:54
閱讀 2002·2019-08-26 12:15
閱讀 2529·2019-08-26 12:09
閱讀 1328·2019-08-26 11:57
閱讀 3333·2019-08-23 17:11
閱讀 1879·2019-08-23 15:59