. NET4.0并行計算技術(shù)基礎(chǔ)(2)
上一部分 介紹了CPU與“核”以及“并行”和“并發(fā)”的區(qū)別,這一部分我們將進(jìn)一步介紹并行計算的性能衡量與并行計算系統(tǒng)的大致分類,為后面介紹.NET 4.0的并行計算打下基礎(chǔ)。
3 如何衡量并行計算的性能提升?
之所以要研究并行計算,其目的是獲得更好的性能。一個軟件系統(tǒng)的性能,通常使用兩個指標(biāo)來進(jìn)行衡量:
(1) 響應(yīng)速度( Responsiveness ) :用戶向軟件系統(tǒng)提交一個工作任務(wù),軟件系統(tǒng)要花費(fèi)多長的時間才能處理完畢并將結(jié)果通知用戶?
(2) 吞吐率( Throughput ) :在單位時間間隔內(nèi)軟件系統(tǒng)最多可以處理多少個工作任務(wù)?
并行計算的優(yōu)勢就在于它可以縮短系統(tǒng)完成單個工作任務(wù)的時間和提升系統(tǒng)的吞吐率。
那么,我們怎樣定量衡量因為“并行”而帶來的系統(tǒng)性能提升?很明顯,這里所說的“提升”是有參照物的,對于并行算法,最直觀的參照物就是完成同樣功能的串行算法。
人們使用
“加速系數(shù)(
speedup factory
)
[1]
”來定量衡量一個并行算法的好壞:
加速系數(shù)越大,說明性能提升越明顯。
我們感興趣的是:
在 p 個處理器上執(zhí)行并行算法,到底比在單個處理器上執(zhí)行串行算法理論上能快多少?如果增加處理器的個數(shù),加速系數(shù)能否進(jìn)一步增大?這種增大有沒有一個限制?
針對這個問題,并行計算理論中有一個著名的“阿姆達(dá)爾定律( Amdahl’s law )”回答了這個問題。
鑒于在實際中“ 100% 純粹”的并行算法很少,此定律假設(shè)算法應(yīng)同時包容串行執(zhí)行和并行執(zhí)行兩部分,其中,串行執(zhí)行的部分占整個算法的比例為 f ,并且假設(shè)并行執(zhí)行部分除了計算外并無其他開銷,則在 p 個處理器上執(zhí)行此算法,其加速系數(shù)為:
從這個公式可以得到一個有趣的結(jié)論。試著讓 p à ∞ ,則上述公式變?yōu)椋?
這說明:在算法中串行部分的比例不變的情況下,不算你使用多少個處理器,加速系數(shù)最大也超不過 1/f !
例如,假設(shè)某算法中有 20% 的串行算法,則不管后面你如何加速,最大加速系數(shù)超不過 5 ( 1/0.2=5 )。
實際情況可能更糟,因為使用并行算法必然會有其它一開銷,比如并行算法都是使用線程來執(zhí)行的,因此,線程的上下文切換就必須耗用系統(tǒng)資源,考虎到這一點,修正后的“阿姆達(dá)爾定律”變?yōu)椋?
其中 H(p) 代表算法并行部分在單個處理器上執(zhí)行所帶來的系統(tǒng)開銷,不同的算法 H(p) 的值也不一樣。
這說明,如果系統(tǒng)開銷非常大,那么采用多線程并行執(zhí)行一個算法,不但沒有加速,反而會降低了程序的執(zhí)行性能。
依據(jù)“阿姆達(dá)爾定律”得出的這個結(jié)論令人沮喪!但由此也可以得到一個重要的結(jié)論: 如果希望使用并行計算來提升程序的性能,那么應(yīng)盡可能地減少程序中串行代碼的比例。
[1] 有的書中將其稱為“加速比”。
擴(kuò)充閱讀:
“樂觀”的 Gustafson 定律
“阿姆達(dá)爾定律”的結(jié)論讓人沮喪,但到了 20 世紀(jì) 80 年代晚期, Sandia 國家實驗室的科學(xué)家們在對具有 1024 個處理器的超立方體結(jié)構(gòu)上觀察到了 3 個實際應(yīng)用程序隨著處理器的增加發(fā)生線性加速的現(xiàn)象,科學(xué)家 John L. Gustafson 基于此實驗數(shù)據(jù)在 1988 年提出了一個新的計算加速系數(shù)的公式:
與“阿姆達(dá)爾定律”一樣, S(p) 代表加速系統(tǒng), p 代表處理器數(shù)量, f 代表算法中串行部分所占的比例。
Gustafson 定律說明在許多實際的應(yīng)用程序中得到接近線性的加速效果是可能的。
“阿姆達(dá)爾定律”的問題出在它的前提過于理想化。因為并行算法通常能處理比串行算法更大規(guī)模的問題,即使算法仍然存在著串行部分,但由于問題規(guī)模的不斷擴(kuò)大,往往會導(dǎo)致算法中串行部分所占比例的持續(xù)減少。 Gustafson 定律又點燃了人們繼續(xù)研制集成更多處理器(或集成更多執(zhí)行核的處理器)的計算機(jī)系統(tǒng)的熱情。可以預(yù)測,未來的計算機(jī)將集成更多的處理器,當(dāng)前雙核個人電腦的普及只不過是一個開始罷了。
4 實際測量并行程序的性能
不管是“悲觀”的阿姆達(dá)爾定律還是“樂觀”的 Gustafson 定律都只是一種理論上的結(jié)果,在真實的運(yùn)行環(huán)境中,影響程序性能的因素有許多,僅靠幾個簡單的公式并不能真正計算出一個真實的“并行”程序比相應(yīng)的“串行”版本到底快了多少。最可靠的方法還是實地測試,在同樣的軟件和硬件環(huán)境中,先后運(yùn)行程序的“并行”和“串行”兩個版本,比對它們的執(zhí)行時間,就知道結(jié)果了。
在 .NET 程序中,我們可以使用 StopWatch 類來測試算法的性能。
以下是使用 StopWatch 測試算法運(yùn)行時間的代碼框架:
Stopwatch sw = new Stopwatch();
sw.Start(); // 啟動計時
// 編寫代碼執(zhí)行被測試的算法
sw.Stop();// 停止計時
// 獲取算法執(zhí)行時間
long UsedTime = sw.ElapsedMilliseconds;
//...
另外,調(diào)用 StopWatch 對象的 Reset() 方法可以重置計時值,再接著調(diào)用 Start() 方法就可以開始一個新的計時。
5 并行計算系統(tǒng)的大致分類
有兩種主要的并行計算系統(tǒng)類型。一種稱為“ 共享存儲器( Shared Memory )的多處理器 ”系統(tǒng),其思想很簡單,所有處理器都可以訪問同一個主存儲器,從而允許運(yùn)行在多個處理器上的各個線程可以通過主存儲器方便地共享信息。
基于共享存儲器的并行計算系統(tǒng)發(fā)展已有許多年,人們也為開發(fā)運(yùn)行于這種平臺的軟件提供了不少工具,其中得到廣泛應(yīng)用的是 OpenMP ,它可以幫助程序員使用 Fortran (或 C/C++ )語言高效地開發(fā)多線程并行計算程序。
C# 和 Visual Basic 編譯器沒有遵循 OpenMP 標(biāo)準(zhǔn),但通過給 .NET 基類庫添加并行擴(kuò)展( Parallel Extensions ),可以使用比 OpenMP 更方便的方法設(shè)計并行計算程序。
擴(kuò)充閱讀:
OpenMP 簡介
針對共享存儲器的并行計算系統(tǒng),為了簡化軟件開發(fā)工作,人們設(shè)計了一個 OpenMP 標(biāo)準(zhǔn),通過給代碼中添加特定的編譯指令,讓實現(xiàn)了此標(biāo)準(zhǔn)編譯器自動地幫助我們生成并行指令代碼。例如,以下是一個典型的循環(huán)代碼:
for (int i = 0; i < 100000; i++)
{
// ……
}
給上述代碼添加一個特殊的編譯指令 :
#pragma omp parallel for
for (int i = 0; i < 100000; i++)
{
// ……
}
遵循 OpenMP 標(biāo)準(zhǔn)開發(fā)的編譯器 “認(rèn)識”此指令,在編譯時會自動生成相關(guān)的指令讓此代碼可以并行執(zhí)行。 OpenMP 的實現(xiàn)機(jī)制決定要創(chuàng)建的線程個數(shù),以及如何能夠盡善盡美地管理這些線程。開發(fā)人員只需告訴 OpenMP 哪個循環(huán)應(yīng)該以多線程方式執(zhí)行,至于那些為了利用并行性而進(jìn)行的線程創(chuàng)建、初始化、線程同步等工作都可以交給 OpenMP 編譯器來完成。
OpenMP 的標(biāo)準(zhǔn)形成于 1997 年,支持使用 Fortran 、 C/C++ 語言編寫的程序。
另一種稱為“消息傳遞的多處理機(jī)”系統(tǒng),其特點是往往由多臺相互連接的計算機(jī)構(gòu)成一個并行計算平臺,計算機(jī)之間通過“消息”的傳遞協(xié)同工作。
基于消息傳遞構(gòu)造的并行計算系統(tǒng)本質(zhì)上是一個分布式軟件系統(tǒng),由于互聯(lián)網(wǎng)的無孔不入,利用互聯(lián)的計算機(jī)實現(xiàn)并行計算是當(dāng)前一個非?;钴S的領(lǐng)域。在微軟平臺之上,使用 WCF 可以很方便地開發(fā)這種類型的軟件系統(tǒng)。本書第 9 篇詳細(xì)介紹 WCF 。
=====================
請看下一講 《.NET 4.0并行計算技術(shù)基礎(chǔ)(3)》
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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