日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

.NET4.0并行計算技術基礎(2)

系統 1694 0

. NET4.0并行計算技術基礎(2)

上一部分 介紹了CPU與“核”以及“并行”和“并發”的區別,這一部分我們將進一步介紹并行計算的性能衡量與并行計算系統的大致分類,為后面介紹.NET 4.0的并行計算打下基礎。

3 如何衡量并行計算的性能提升?

之所以要研究并行計算,其目的是獲得更好的性能。一個軟件系統的性能,通常使用兩個指標來進行衡量:

(1) 響應速度( Responsiveness :用戶向軟件系統提交一個工作任務,軟件系統要花費多長的時間才能處理完畢并將結果通知用戶?

(2) 吞吐率( Throughput :在單位時間間隔內軟件系統最多可以處理多少個工作任務?

并行計算的優勢就在于它可以縮短系統完成單個工作任務的時間和提升系統的吞吐率。

那么,我們怎樣定量衡量因為“并行”而帶來的系統性能提升?很明顯,這里所說的“提升”是有參照物的,對于并行算法,最直觀的參照物就是完成同樣功能的串行算法。

人們使用 “加速系數( speedup factory [1] ”來定量衡量一個并行算法的好壞:

加速系數越大,說明性能提升越明顯。

我們感興趣的是:

p 個處理器上執行并行算法,到底比在單個處理器上執行串行算法理論上能快多少?如果增加處理器的個數,加速系數能否進一步增大?這種增大有沒有一個限制?

針對這個問題,并行計算理論中有一個著名的“阿姆達爾定律( Amdahl’s law )”回答了這個問題。

鑒于在實際中“ 100% 純粹”的并行算法很少,此定律假設算法應同時包容串行執行和并行執行兩部分,其中,串行執行的部分占整個算法的比例為 f ,并且假設并行執行部分除了計算外并無其他開銷,則在 p 個處理器上執行此算法,其加速系數為:

從這個公式可以得到一個有趣的結論。試著讓 p à ,則上述公式變為:

這說明:在算法中串行部分的比例不變的情況下,不算你使用多少個處理器,加速系數最大也超不過 1/f

例如,假設某算法中有 20% 的串行算法,則不管后面你如何加速,最大加速系數超不過 5 1/0.2=5 )。

實際情況可能更糟,因為使用并行算法必然會有其它一開銷,比如并行算法都是使用線程來執行的,因此,線程的上下文切換就必須耗用系統資源,考虎到這一點,修正后的“阿姆達爾定律”變為:

其中 H(p) 代表算法并行部分在單個處理器上執行所帶來的系統開銷,不同的算法 H(p) 的值也不一樣。

這說明,如果系統開銷非常大,那么采用多線程并行執行一個算法,不但沒有加速,反而會降低了程序的執行性能。

依據“阿姆達爾定律”得出的這個結論令人沮喪!但由此也可以得到一個重要的結論: 如果希望使用并行計算來提升程序的性能,那么應盡可能地減少程序中串行代碼的比例。



[1] 有的書中將其稱為“加速比”。

擴充閱讀:

“樂觀”的 Gustafson 定律

“阿姆達爾定律”的結論讓人沮喪,但到了 20 世紀 80 年代晚期, Sandia 國家實驗室的科學家們在對具有 1024 個處理器的超立方體結構上觀察到了 3 個實際應用程序隨著處理器的增加發生線性加速的現象,科學家 John L. Gustafson 基于此實驗數據在 1988 年提出了一個新的計算加速系數的公式:

與“阿姆達爾定律”一樣, S(p) 代表加速系統, p 代表處理器數量, f 代表算法中串行部分所占的比例。

Gustafson 定律說明在許多實際的應用程序中得到接近線性的加速效果是可能的。

“阿姆達爾定律”的問題出在它的前提過于理想化。因為并行算法通常能處理比串行算法更大規模的問題,即使算法仍然存在著串行部分,但由于問題規模的不斷擴大,往往會導致算法中串行部分所占比例的持續減少。 Gustafson 定律又點燃了人們繼續研制集成更多處理器(或集成更多執行核的處理器)的計算機系統的熱情。可以預測,未來的計算機將集成更多的處理器,當前雙核個人電腦的普及只不過是一個開始罷了。

4 實際測量并行程序的性能

不管是“悲觀”的阿姆達爾定律還是“樂觀”的 Gustafson 定律都只是一種理論上的結果,在真實的運行環境中,影響程序性能的因素有許多,僅靠幾個簡單的公式并不能真正計算出一個真實的“并行”程序比相應的“串行”版本到底快了多少。最可靠的方法還是實地測試,在同樣的軟件和硬件環境中,先后運行程序的“并行”和“串行”兩個版本,比對它們的執行時間,就知道結果了。

.NET 程序中,我們可以使用 StopWatch 類來測試算法的性能。

以下是使用 StopWatch 測試算法運行時間的代碼框架:

Stopwatch sw = new Stopwatch();

sw.Start(); // 啟動計時

// 編寫代碼執行被測試的算法

sw.Stop();// 停止計時

// 獲取算法執行時間

long UsedTime = sw.ElapsedMilliseconds;

//...

另外,調用 StopWatch 對象的 Reset() 方法可以重置計時值,再接著調用 Start() 方法就可以開始一個新的計時。

5 并行計算系統的大致分類

有兩種主要的并行計算系統類型。一種稱為“ 共享存儲器( Shared Memory )的多處理器 ”系統,其思想很簡單,所有處理器都可以訪問同一個主存儲器,從而允許運行在多個處理器上的各個線程可以通過主存儲器方便地共享信息。

.NET4.0并行計算技術基礎(2)

基于共享存儲器的并行計算系統發展已有許多年,人們也為開發運行于這種平臺的軟件提供了不少工具,其中得到廣泛應用的是 OpenMP ,它可以幫助程序員使用 Fortran (或 C/C++ )語言高效地開發多線程并行計算程序。

C# Visual Basic 編譯器沒有遵循 OpenMP 標準,但通過給 .NET 基類庫添加并行擴展( Parallel Extensions ),可以使用比 OpenMP 更方便的方法設計并行計算程序。

擴充閱讀:

OpenMP 簡介

針對共享存儲器的并行計算系統,為了簡化軟件開發工作,人們設計了一個 OpenMP 標準,通過給代碼中添加特定的編譯指令,讓實現了此標準編譯器自動地幫助我們生成并行指令代碼。例如,以下是一個典型的循環代碼:

for (int i = 0; i < 100000; i++)

{

// ……

}

給上述代碼添加一個特殊的編譯指令 :

#pragma omp parallel for

for (int i = 0; i < 100000; i++)

{

// ……

}

遵循 OpenMP 標準開發的編譯器 “認識”此指令,在編譯時會自動生成相關的指令讓此代碼可以并行執行。 OpenMP 的實現機制決定要創建的線程個數,以及如何能夠盡善盡美地管理這些線程。開發人員只需告訴 OpenMP 哪個循環應該以多線程方式執行,至于那些為了利用并行性而進行的線程創建、初始化、線程同步等工作都可以交給 OpenMP 編譯器來完成。

OpenMP 的標準形成于 1997 年,支持使用 Fortran C/C++ 語言編寫的程序。

另一種稱為“消息傳遞的多處理機”系統,其特點是往往由多臺相互連接的計算機構成一個并行計算平臺,計算機之間通過“消息”的傳遞協同工作。

.NET4.0并行計算技術基礎(2)

基于消息傳遞構造的并行計算系統本質上是一個分布式軟件系統,由于互聯網的無孔不入,利用互聯的計算機實現并行計算是當前一個非常活躍的領域。在微軟平臺之上,使用 WCF 可以很方便地開發這種類型的軟件系統。本書第 9 篇詳細介紹 WCF

=====================

請看下一講 《.NET 4.0并行計算技術基礎(3)》

.NET4.0并行計算技術基礎(2)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 吴川市| 绥阳县| 兴山县| 峨眉山市| 上犹县| 札达县| 灵武市| 萍乡市| 南充市| 元朗区| 瓦房店市| 海宁市| 武汉市| 万年县| 曲阜市| 吴川市| 河津市| 成安县| 柯坪县| 勐海县| 平顶山市| 商洛市| 张家界市| 榆树市| 会东县| 嘉定区| 定安县| 广宗县| 黎城县| 洛阳市| 会宁县| 滁州市| 新丰县| 梁山县| 无棣县| 阳信县| 遵义县| 宁阳县| 彰武县| 正蓝旗| 三门县|