日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《多核与GPU编程:工具、方法及实践》----1.5 并行程序性能的预测与测量

發(fā)布時(shí)間:2025/3/18 编程问答 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《多核与GPU编程:工具、方法及实践》----1.5 并行程序性能的预测与测量 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本節(jié)書摘來自華章出版社《多核與GPU編程:工具、方法及實(shí)踐》一書中的第1章,第1.5節(jié), 作 者 Multicore and GPU Programming: An Integrated Approach[阿聯(lián)酋]杰拉西莫斯·巴拉斯(Gerassimos Barlas) 著,張?jiān)迫≠Z海鵬 李士剛 袁良 等譯, 更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“華章計(jì)算機(jī)”公眾號(hào)查看。

1.5 并行程序性能的預(yù)測(cè)與測(cè)量

構(gòu)建并行程序要比串行程序更具挑戰(zhàn)性。并行程序程序員需要解決諸如共享資源訪問、負(fù)載均衡(即,將計(jì)算負(fù)載分配到所有計(jì)算資源上來最小化執(zhí)行時(shí)間)以及程序終止(即,以協(xié)調(diào)方式暫停程序)等相關(guān)問題。

編寫并行程序應(yīng)該首先確定并行能否提升程序性能,加速問題的解決。并行程序的開發(fā)成本決定了程序員不可能簡(jiǎn)單地實(shí)現(xiàn)多個(gè)并行版本,通過測(cè)試找出最佳和最差版本,來評(píng)估項(xiàng)目的可行性。雖然對(duì)于最簡(jiǎn)單的問題,這個(gè)方法可能是可行的。但是即使能夠這樣,如果能夠確定一個(gè)先驗(yàn)的最佳開發(fā)路徑,并按照這個(gè)路徑進(jìn)行并行開發(fā),是非常有利的。

并行程序的開發(fā)始于其對(duì)應(yīng)的串行版本。雖然這看起來有些矛盾,但是我們需要回答這些問題:如果沒有一個(gè)對(duì)應(yīng)的串行程序版本,我們?nèi)绾沃啦⑿谐绦驅(qū)π阅艿奶嵘?#xff1f;我們需要一個(gè)基準(zhǔn)性能,而這個(gè)基準(zhǔn)性能只能從串行程序中獲得。此外,我們?nèi)绾闻卸ú⑿谐绦驁?zhí)行結(jié)果的正確性?當(dāng)然,這并不是說串行程序的執(zhí)行結(jié)果肯定是正確的,但是串行程序能夠更容易獲得正確的執(zhí)行結(jié)果。

當(dāng)然,串行算法及相關(guān)程序的開發(fā)也可以提供一些該程序是否能夠并行化的信息。這是很關(guān)鍵的,因?yàn)槲覀冃枰卮痍P(guān)于并行程序的可行性及成本效益的幾個(gè)問題:

程序中最耗時(shí)的子程序在哪里?這是最應(yīng)該并行化的部分。

這些子程序一旦被確定后,并假設(shè)是可以并行化的。那么,期望的性能提升是多少?

這里需要澄清一個(gè)問題:并行所需的串行程序并不是能夠解決相同問題的任意程序。它必須能夠并行化。例如,如果需要對(duì)數(shù)據(jù)進(jìn)行并行排序,那么最適合的串行實(shí)現(xiàn)為桶排序算法。桶排序算法的串行實(shí)現(xiàn)可以幫助我們預(yù)測(cè)并行實(shí)現(xiàn)的性能,并能夠指出算法中最耗時(shí)的部分。雖然快速排序的串行實(shí)現(xiàn)可以提供基準(zhǔn)性能信息,但是它不能回答上面提到的兩個(gè)問題。

一旦實(shí)現(xiàn)串行版本后,我們可以利用性能分析工具(profiler)來回答上面兩個(gè)問題。性能分析工具可以收集程序的調(diào)用頻率、執(zhí)行時(shí)間以及內(nèi)存使用等信息。性能分析工具使用許多不同技術(shù)來執(zhí)行這些任務(wù)。其中,最常用的技術(shù)如下:

程序插樁(instrumentation):修改將要進(jìn)行性能分析的程序代碼以便收集信息。例如,在每條指令執(zhí)行之前增加一個(gè)專用計(jì)數(shù)器。雖然這可以提供非常精確的信息,但同時(shí)會(huì)增加程序的執(zhí)行時(shí)間。除此之外,該技術(shù)需要重新編譯目標(biāo)程序。

采樣(sampling):定期中斷目標(biāo)程序以便查詢正在執(zhí)行的函數(shù)。顯然,該技術(shù)不能提供同程序插樁一樣的精確信息,但是目標(biāo)程序不需要重新編譯,且執(zhí)行時(shí)間也不會(huì)發(fā)生大的變化。

valgrind程序分析工具集包含了一個(gè)基于程序插樁技術(shù)的性能分析工具。該工具在執(zhí)行性能分析操作之前進(jìn)行程序插樁操作,這意味著不需要用戶干預(yù)。下面是該工具使用的一個(gè)例子:



其中,./bucketsort 1000000為目標(biāo)程序和程序參數(shù)。

該工具的輸出是一個(gè)命名為callgrind.out的文件,該文件包含了分析結(jié)果。該結(jié)果可以通過前端程序(如kcachegrind)進(jìn)行可視化。圖1-10為可視化結(jié)果。



當(dāng)然,相關(guān)領(lǐng)域的經(jīng)驗(yàn)和知識(shí)可以允許程序員無須對(duì)串行程序進(jìn)行性能分析,就可以確定串行程序中需要并行化的熱點(diǎn)。

然而,性能分析工具可以回答第二個(gè)問題:并行程序可以提供多少潛在的性能提升。傳統(tǒng)上,這可以通過近似數(shù)學(xué)模型實(shí)現(xiàn),該數(shù)學(xué)模型允許我們捕捉將要執(zhí)行的計(jì)算的本質(zhì)問題。通過對(duì)串行程序執(zhí)行性能分析操作,可以提供這些數(shù)學(xué)模型的參數(shù)。接下來的一節(jié)將討論Amdahl定律,該定律即使上述的簡(jiǎn)單模型。

除數(shù)學(xué)模型的性能預(yù)測(cè)之外,必須要對(duì)并行程序進(jìn)行實(shí)際測(cè)試,這主要有兩個(gè)原因:正確性和性能。并行程序的正確性必須要進(jìn)行驗(yàn)證。并行程序可以以不確定的方式執(zhí)行,因?yàn)闀r(shí)間可能會(huì)影響計(jì)算結(jié)果。當(dāng)然,并行程序一般會(huì)消除這個(gè)不良特性。此外,測(cè)試可以暴露并行程序初始設(shè)計(jì)的弱點(diǎn)以及需要解決的性能問題。

正確測(cè)試并行程序的方法如下。

除非特殊說明,否則需要測(cè)試并行程序的整體執(zhí)行時(shí)間。如果串行程序只有一部分并行化,可僅針對(duì)這部分進(jìn)行加速比和效率計(jì)算。然而,整體運(yùn)行時(shí)間可用來檢測(cè)并行方案對(duì)整體性能的影響,并判斷其成本效益。例如,假設(shè)一個(gè)程序僅僅有10%的部分進(jìn)行了并行化,即使這部分的加速比為100倍。如果該程序的串行版本的運(yùn)行時(shí)間為100秒,那么并行版本的運(yùn)行時(shí)間也高于90秒。

性能結(jié)果應(yīng)該是多次執(zhí)行時(shí)間的平均值,可能包括標(biāo)準(zhǔn)偏差。執(zhí)行次數(shù)因問題而異。例如,如果對(duì)一個(gè)執(zhí)行時(shí)間為3天的應(yīng)用程序執(zhí)行100次,顯然是不現(xiàn)實(shí)的。然而,只運(yùn)行3次求平均值會(huì)產(chǎn)生不可靠的統(tǒng)計(jì)數(shù)據(jù)。因此,需要一個(gè)謹(jǐn)慎的平衡。

去除“異常值”。即,在計(jì)算平均值時(shí),需要去除過大或者過小的性能結(jié)果。這是因?yàn)檫@些結(jié)果通常表示執(zhí)行異常(例如,訪存越界或者計(jì)算機(jī)的負(fù)載發(fā)生了變化)。然而,需要重點(diǎn)對(duì)不利結(jié)果做出解釋而不是簡(jiǎn)單去除。

可擴(kuò)展性是非常重要的。所以,需要測(cè)試不同輸入規(guī)模及不同計(jì)算平臺(tái)大小下的性能結(jié)果(理想情況下,需要覆蓋真實(shí)應(yīng)用場(chǎng)景的所有情況)。

性能測(cè)試時(shí)的輸入應(yīng)該從小到大,但應(yīng)該都包括真實(shí)應(yīng)用場(chǎng)景中的問題規(guī)模(如果這個(gè)規(guī)模可以確定)。

當(dāng)使用多核計(jì)算平臺(tái)時(shí),并行程序開啟的線程或者進(jìn)程數(shù)量不應(yīng)超過可用的硬件提供的計(jì)算內(nèi)核的數(shù)目。超線程是一個(gè)特例,因?yàn)檫@個(gè)技術(shù)使操作系統(tǒng)認(rèn)為處理器的計(jì)算內(nèi)核數(shù)目是實(shí)際值的兩倍。然而,這些邏輯計(jì)算內(nèi)核并不具備真正計(jì)算內(nèi)核的計(jì)算能力。所以,雖然操作系統(tǒng)認(rèn)為這些內(nèi)核是有效的(例如,有8個(gè)計(jì)算內(nèi)核),但是相對(duì)應(yīng)的硬件資源不存在,這樣對(duì)可擴(kuò)展性的分析是不利的。理想情況下,當(dāng)測(cè)試可擴(kuò)展性時(shí),應(yīng)該關(guān)閉超線程,或者開啟的線程數(shù)目不要超過實(shí)際的物理內(nèi)核數(shù)。

下一節(jié)討論的兩個(gè)定律可在不需要對(duì)并行程序進(jìn)行實(shí)現(xiàn)和測(cè)試的前提下,預(yù)測(cè)并行程序性能。盡管已證明Amdahl定律是有缺陷的,但是它依然有影響力。

1.5.1 Amdahl定律

1967年,Gene Amdahl定義了一個(gè)簡(jiǎn)單的實(shí)驗(yàn)思想來獲取并行程序的可能
性能收益。Amdahl假設(shè):

我們有一個(gè)在單CPU上執(zhí)行時(shí)間為T的串行程序。

該串行程序可并行的比例為α,其中0≤α≤1。同時(shí),串行處理剩余的1–α部分。

并行執(zhí)行沒有通信開銷,并且并行部分可以平均分配到多個(gè)CPU上執(zhí)行。這個(gè)假設(shè)適應(yīng)于多核CPU架構(gòu),因?yàn)樵谶@種架構(gòu)下,所有計(jì)算內(nèi)核共享內(nèi)存。
基于這些假設(shè),在N個(gè)計(jì)算節(jié)點(diǎn)上能夠獲得的加速比上限是:



(1-5)
因?yàn)槲覀兒雎粤怂腥蝿?wù)劃分/通信/協(xié)調(diào)開銷。所以,如果設(shè)定N →∞,式(1-5)定義的可能最大加速比是:



(1-6)
式(1-6)非常重要,它通過簡(jiǎn)單、容易記憶的方式解決了一個(gè)非常復(fù)雜的問題:并行程序?qū)τ趩栴}的解決可以帶來多少性能提升?同時(shí),式(1-6)采用了完全抽象的方式,不依賴于具體的計(jì)算平臺(tái),僅與問題的特性相關(guān),即α。



圖1-11顯示了在α取不同值的情況下,Amdahl定律的性能預(yù)測(cè)。這是非常引人注意的,因?yàn)轭A(yù)測(cè)的加速比受到了嚴(yán)格限制。即使α是一個(gè)比較好的值,加速比依然很低。例如當(dāng)α = 0.9時(shí),無論使用多少個(gè)處理器,加速比不可能超過10。

同樣的情況也出現(xiàn)在圖1-12中的效率曲線中。即使α = 95%,效率也會(huì)有較大幅度的降低。

Amdahl定律有一個(gè)非常有意思的結(jié)果,這可能是該定律產(chǎn)生的原因。Amdahl定律是在小型機(jī)出現(xiàn)的時(shí)代發(fā)布的。與大型機(jī)相比,小型機(jī)便宜但計(jì)算性能差。一個(gè)問題出現(xiàn)了:哪個(gè)是加速問題解決的最佳投資?是昂貴但計(jì)算性能高的大型機(jī)還是便宜但計(jì)算性能低的小型機(jī)呢?

用“蟻群與象群”這個(gè)比喻來描述這個(gè)兩難的問題,產(chǎn)生的結(jié)果是沒有疑問的。基于這個(gè)假設(shè)的數(shù)學(xué)證明如下:假設(shè)有一個(gè)應(yīng)用程序,在單個(gè)高性能CPU A上執(zhí)行的時(shí)間為TA,在單個(gè)較低性能CPU B上執(zhí)行的時(shí)間為TB。那么,根據(jù)執(zhí)行時(shí)間,CPU A要比CPU B快r=TB/TA倍。如果我們購買NB個(gè)性能較低的CPU B,相對(duì)于單個(gè)高性能CPU A,我們可能達(dá)到的最高加速比為:



(1-7)
如果NB無限大,我們可以得到的加速比上限為:



(1-8)
這就意味著加速比不會(huì)超過1。



(1-9)
所以,當(dāng) α = 90%且 r = 10時(shí),最佳的解決方案是使用單個(gè)昂貴但性能高的CPU,而不是使用多個(gè)便宜但性能低的CPU。

問題是這個(gè)結(jié)果與高性能計(jì)算的現(xiàn)實(shí)并不一致。2014年6月公布的全球超級(jí)計(jì)算機(jī)Top 500排行榜中,由幾萬到上百萬個(gè)桌面級(jí)處理器的計(jì)算內(nèi)核(其中,排第1名的中國“天河二號(hào)”擁有3 120 000個(gè)計(jì)算內(nèi)核)構(gòu)成的超級(jí)計(jì)算機(jī)是主流的。如果蟻群獲取了勝利,說明我們的方法存在缺陷。這將在下一節(jié)討論。

1.5.2 Gustafson-Barsis定律

Amdahl定律是錯(cuò)誤的,因?yàn)橐呀?jīng)反復(fù)證明它無法解釋現(xiàn)實(shí)數(shù)據(jù):并行程序經(jīng)常超過預(yù)期的加速比限制。

最終,在Amdahl定律發(fā)布20年后,Gustafson 和 Barsis開始以一種更為恰當(dāng)?shù)姆绞竭M(jìn)行問題測(cè)試。

并行計(jì)算平臺(tái)并不是僅僅加速串行程序的執(zhí)行。它可以處理更大的問題。所以,我們應(yīng)該測(cè)試當(dāng)使用串行計(jì)算平臺(tái)來處理并行計(jì)算平臺(tái)處理的相同問題時(shí),串行計(jì)算平臺(tái)該如何處理。而不是測(cè)試并行程序相對(duì)于串行程序的性能加速比。

假設(shè):
有一個(gè)并行應(yīng)用程序,在N個(gè)CPU上執(zhí)行的時(shí)間為T。

該應(yīng)用程序在所有計(jì)算機(jī)上運(yùn)行的時(shí)間占總運(yùn)行時(shí)間的比例為:0 ≤ α ≤ 1,剩下的1 – α需要串行處理。

在串行計(jì)算機(jī)上解決該問題所需要的總時(shí)間為:



(1-10)
因?yàn)樵⑿杏?jì)算部分現(xiàn)在需要串行處理。
加速比如下:



(1-11)
對(duì)應(yīng)的效率如下:



(1-12)
當(dāng)N無限大時(shí),效率的下限是α。

圖1-13顯示了這種情況下的加速比曲線,它是圖1-11的一個(gè)變種。當(dāng)不考慮通信開銷時(shí),其結(jié)果確實(shí)過于樂觀,但這正是潛力所在。



圖1-14中的效率曲線依然非常不錯(cuò)。即使當(dāng)α = 50%時(shí),在16個(gè)CPU上的效率也沒有低于50%。這也太異想天開了。即使是極易并行的程序,當(dāng)N不斷增大時(shí),通信開銷會(huì)成為加速比和效率降低的一個(gè)重要因素。通常情況下,能夠獲得90%的效率就已經(jīng)是非常不錯(cuò)的成就了。



習(xí)題

1.研究全球超級(jí)計(jì)算機(jī)性能排名中的Top 10,指出這些超級(jí)計(jì)算機(jī):

運(yùn)行什么操作系統(tǒng)?
由多少個(gè)CPU/GPU構(gòu)成?
總內(nèi)存是多少?
用于編程的軟件工具是什么?

2.AMD和NVIDIA的頂級(jí)GPU包含多少個(gè)計(jì)算內(nèi)核?這些芯片的峰值性能是多少GFlop?

3.世界上最強(qiáng)大的超級(jí)計(jì)算機(jī)性能會(huì)有兩個(gè)值:Rpeak和Rmax,單位都是TFlo/s(每秒進(jìn)行多少百萬億次浮點(diǎn)計(jì)算)。為什么要這樣做?從Rpeak到Rmax,性能降低的因素是什么?有沒有可能達(dá)到Rpeak?

4.一個(gè)串行應(yīng)用程序中,有20%的比例必須串行執(zhí)行,現(xiàn)需要實(shí)現(xiàn)3倍的性能提升。為實(shí)現(xiàn)這個(gè)目標(biāo),需要多少個(gè)CPU?如果要實(shí)現(xiàn)5倍的加速比,需要多少個(gè)CPU?

5.一個(gè)運(yùn)行在5臺(tái)計(jì)算機(jī)上的并行程序中,有10%的并行部分。相對(duì)于在一個(gè)計(jì)算機(jī)上的串行執(zhí)行,加速比是多少?如果我們想將加速比提升兩倍,需要多少個(gè)CPU?

  • 將一個(gè)不可并行部分占5%的應(yīng)用程序修改為并行程序。目前市場(chǎng)上有兩種并行計(jì)算機(jī):計(jì)算機(jī)X有4個(gè)CPU,每個(gè)CPU可在1個(gè)小時(shí)內(nèi)完成該應(yīng)用程序的執(zhí)行;計(jì)算機(jī)Y有16個(gè)CPU,每個(gè)CPU可在2個(gè)小時(shí)內(nèi)執(zhí)行完該應(yīng)用程序。如果需要最小化運(yùn)行時(shí)間,你該買哪個(gè)計(jì)算機(jī)?
  • 7.使用合并排序算法實(shí)現(xiàn)一個(gè)簡(jiǎn)單的排序程序,該程序用來對(duì)大規(guī)模(比如107)32位的整型數(shù)據(jù)進(jìn)行排序。輸入和輸出數(shù)據(jù)存儲(chǔ)在文件中,所以I/O操作為該應(yīng)用程序的串行部分。盡管合并排序算法不能在任意多個(gè)處理器上平均分配計(jì)算負(fù)載,但該算法依然被認(rèn)為是非常適合并行執(zhí)行的排序算法。假設(shè)計(jì)算負(fù)載能夠平均分配。應(yīng)用程序可并行部分的運(yùn)行時(shí)間占整體運(yùn)行時(shí)間的比例為α,該值通過性能分析工具(如gprof 或者valgrind)獲得。使用這個(gè)值來預(yù)測(cè)合并排序程序的加速比。

    α依賴于輸入規(guī)模嗎?如果依賴,你該如何修改預(yù)測(cè)值及對(duì)應(yīng)的圖形說明?

    8.一個(gè)并行程序在10個(gè)CPU上執(zhí)行,執(zhí)行時(shí)間為串行執(zhí)行總時(shí)間的15%。我們應(yīng)該使用性能為多少的CPU,才能保證串行運(yùn)行時(shí)間和并行運(yùn)行時(shí)間相同?

    總結(jié)

    以上是生活随笔為你收集整理的《多核与GPU编程:工具、方法及实践》----1.5 并行程序性能的预测与测量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。