有些問題使用越多的資源就能越快地解決——越多的工人參與收割莊稼,那麼就能越快地完成收穫。另一些任務根本就是序列化的——增加更多的工人根本不可能提高收割速度。如果我們使用執行緒的重要原因之一是為了支配多處理器的能力,我們必須保證問題被恰當地進行了並行化的分解,並且我們的程式有效地使用了這種並行的潛能。
大多數併發程式都與農耕有著很多相似之處,由一系列並行和序列化的片斷組成。amdahl定律描述了在乙個系統中,基於可並行化和序列化的元件各自所佔的比重,程式通過獲得額外的計算資源,理論上能夠加速多少。如果f是必須序列化執行的比重,那麼amdahl定律告訴我們,在乙個n 處理器的機器中,我們最多可以加速:
當n 無限增大趨近無窮時,speedup 的最大值無限趨近1/f ,這意味著乙個程式中如果50%的處理都需要序列進行的話,speedup 只能提公升2倍(不考慮事實上有多少執行緒可用);如果程式的10%需要序列進行,speedup 最多能夠提高近10倍。amdahl定律同樣量化了序列化的效率開銷。在擁有10個處理器的系統中,程式如果有10%是序列化的,那麼最多可以加速5.3倍(53%的使用率),在擁有100個處理器的系統中,這個數字可以達到9.2(9%的使用率)。這使得無效的cpu利用永遠不可能到達10倍。
圖11.1展示了隨著序列執行和處理器數量變化,處理器最大限度的利用率的曲線。隨著處理器數量的增加,我們很明顯地看到,即使序列化執行的程度發生細微的百分比變化,都會大大限制吞吐量隨計算資源增加。
第6章**了如何識別邏輯邊界,從而把應用程式分解為不同的任務。但是為了在多處理器系統中預知你的程式是否存在加速的可能性,你同樣需要識別你的任務中序列的部分。
圖11.1 amdahl定律中不同序列化的百分比,帶來的最大的效能
清單11.1中,假設應用程式中n 個執行緒正在執行dowork,從乙個共享的工作佇列中取出任務,並處理;假設這裡的任務並不依賴其他任務的結果或邊界效應。忽略任務進行佇列操作的時間,如果我們增加處理器,應用程式會隨之發生什麼樣的改進呢?乍看這個程式可能完全由並行任務組成,並不會相互等待,那麼處理器越多,更多的任務就越可能併發處理。然而,其中也包含序列元件——從佇列中獲取任務。所有工作者執行緒都共享工作佇列,因此它會需要一些同步機制,從而在併發訪問中保持完整性。如果通過加鎖來守衛佇列狀態,那麼當乙個執行緒從佇列中取出任務的時候,其他執行緒想要取得下乙個任務就必須等待——這便是任務處理中序列的部分。
單個任務的處理時間不僅包括執行任務runnable的時間,也包括從共享佇列中取出任務的時間。如果工作佇列是linkedblockingqueue型別的,這個取出的操作被阻塞的可能性小於使用同步的linkedlist的阻塞可能,這是因為linkedblockingqueue使用了更具伸縮性的演算法,但是訪問所有共享的資料結構,本質上都會向程式引入乙個序列的元素。
這個例子同樣忽略了另乙個的相同的序列源(source of serialization):結果處理。所有有用的計算都產生一些結果集或者邊界效應——如果不是,它們可以當作死**(dead code)被遺棄掉。因為runnable沒有提供明確的結果處理,這些任務必須具有一些邊界效應,設定把它們的結果寫入日誌還是存入乙個資料結構。日誌檔案和結果容器通常由多個工作者執行緒共享,並且因此成為了同源的序列部分。如果不是每個執行緒各自維護自己的結果的資料結構,而是在所有任務都執行完成後合併所有的結果,這最終的合併就成為了乙個序列源。
清單11.1 序列訪問任務佇列
public class workerthread extends thread
public void run() catch (interruptedexception e)
} }}
Amdahl 定律詳解
fe 可改進部分占用的時間 任務總時間 se 改進前改進部分占用的時間 改進後改進部分占用的時間 那麼fe se 則表示 改進後改進部分占用的時間 改進後執行總任務時間,即改進後改進部分所佔總任務的比例 1 fe 表示不可改進部分佔據總任務的比例,當然這裡表示改進之前的。加速比sn t0 tn 1 ...
Amdahl 定律(筆記1)
序列 並行 基礎 該定律的主要思想是,當我們對系統某個部分加速時,其對系統整體效能的影響取決於該部分的重要性和加速程度。設系統執行某程式最初所需時間為t1t t1 1t t1 提公升後為 at1t t1 k,故提公升後總執行時間為 t 2 1 a t1 at1 k t1 1 a a k t 1 a ...
java併發(三十一)Amdahl定律
b 阿姆達爾定律 b 阿姆達爾 amdahl 定律是計算機系統設計的重要定量原理之一,於1967年由ibm360系列機的主要設計者阿姆達爾首先提出。該定律是指 系統中對某一部件採用更快執行方式所能獲得的系統效能改進程度,取決於這種執行方式被使用的頻率,或所佔總執行時間的比例。阿姆達爾定律實際上定義了...