標籤:blog http com html 資料 htm
現在普通PC平台上面多核處理器的普及,讓我們領教了能夠利用多核進行並行計算的軟體的處理能力,同時繼承更多地核心正是當前處理器發展的趨勢。
但是作為一個.NET開發人員,是否有時候會發現你的程式佔用了其中一個核心的大部分已耗用時間,甚至達到了100%,除了繼續最佳化處理問題的演算法。
那麼還有方法能夠利用CPU的其它核心為你的應用程式所用嗎?答案是顯然可以的。
你所要做的,就是把應用程式的任務分割成塊,使各塊在同一時間運行。
.Net 4.0引入了一種新的編程模型,結合VS2010使得開發並行應用程式變得更加容易。.Net4.0提供了工作平行程式庫(TPL)與並行語言查詢集合(PLINQ)。VS2010提供了調試並行程式的工具和分析工具。
把現行的程式任務改編成可以並行啟動並執行任務需要以下幾個步驟:
1.分解:瞭解任務,選擇合適的粒度把任務拆分成離散的單元方法(函數)
2.協調:選擇協調這些並行任務的方法(資料流或者控制流程)
3.可擴充共用:任務間共用資料的設計(例如通過阻塞並發線程實現資料同步,鎖,比較並交換,號誌等),記住,不管是什麼同步設計都必然產生順序的形式,都會對效能效率產生負面影響。
並發與並行的區別:
並發的目的是防止線程饑餓,強調的是每個線程都能有自己的時間片來運行,減少相應的時延。
並行解決的問題是關於輸送量的,是一種最佳化手段,目的是為了充分利用多核處理器。
既然並行可以利用多核處理器的威力,那麼當核心數目增加時,我們的應用程式加速是否可以隨著利用的核心數目增加而成線性增長呢?
答案是否定的,除非需要處理的任務沒有順序執行部分。
例如: 假設一個任務分為兩部分:不能被並行化的部分a,可以並行化的部分b。
當任務在單核處理器上面順序執行時,分別需要的時間為 Ta,Tb,記Ta+Tb=S
如果把任務放到n核心處理器上面運行,則理論的已耗用時間應該是〉=Ta+(Tb/n)
則得到加速比 r〈=[S/(Ta+Tb/n)]=[S/(Ta+(S-Ta)/n)]=1/[Ta/S+(1-Ta/S)/n]
當n無限增大時 r的極限為r〈=S/Ta
所以加速比的極限為S/Ta。
此定律為阿姆達爾定律,它為我們的並行計算指明了可以改進的方向,盡量減少順序部分佔所有時間的比例。並且如果任務的順序部分比例很大的時候,即使把可並行部分轉換為並存執行,也是意義不大的。
完畢。
Andy Zeng
歡迎任何形式的轉載,但請務必註明出處。
http://www.cnblogs.com/andyzeng/p/3704333.html