用NVIDIA NsightcComputeRoofline分析加速高性能HPC的应用
用NVIDIA NsightcComputeRoofline分析加速高性能HPC的應(yīng)用
編寫(xiě)高性能的軟件不是一件簡(jiǎn)單的任務(wù)。當(dāng)有了可以編譯和運(yùn)行的代碼之后,當(dāng)您嘗試并理解它在可用硬件上的執(zhí)行情況時(shí),將引入一個(gè)新的挑戰(zhàn)。不同的平臺(tái),無(wú)論是cpu、gpu還是其他平臺(tái),都會(huì)有不同的硬件限制,比如可用內(nèi)存帶寬和理論計(jì)算限制。Roofline性能模型幫助您了解應(yīng)用程序使用可用硬件資源的情況,以及哪些資源可能會(huì)限制應(yīng)用程序的性能。在勞倫斯伯克利國(guó)家實(shí)驗(yàn)室,國(guó)家能源研究科學(xué)計(jì)算中心(NERSC)和計(jì)算研究部(CRD)一直在使用該模型來(lái)分析和優(yōu)化NVIDIA gpu上運(yùn)行的HPC代碼。
傳統(tǒng)的Roofline模型依賴于兩個(gè)特征來(lái)描述工作量:
算力:計(jì)算工作(FLOPs)和數(shù)據(jù)移動(dòng)(字節(jié))之間的比率
FLOP/s:每秒浮點(diǎn)運(yùn)算
有了這些信息,可以在一個(gè)包含性能限制的Roofline和頂層的圖形上繪制一個(gè)內(nèi)核,并將它們對(duì)內(nèi)核的影響可視化。
Roofline模型是在伯克利實(shí)驗(yàn)室發(fā)明的。一種用于收集NVIDIA GPU Roofline分析的相關(guān)性能數(shù)據(jù)的方法,該方法已經(jīng)被原型化和驗(yàn)證:
· Performance Analysis of GPU-Accelerated Applications using the Roofline Model
· Roofline Performance Modeling for
HPC and Deep Learning Applications
· Hierarchical Roofline Analysis for GPUs: Accelerating Performance Optimization for the NERSC‐9 Perlmutter System
基于Roofline模型的GPU加速應(yīng)用性能分析
高性能HPC和深度學(xué)習(xí)應(yīng)用的Roofline性能建模 gpu的分層Roofline分析:加速NERSC-9 Perlmutter系統(tǒng)的性能優(yōu)化
鑒于Roofline分析在高性HPC中的普及,NVIDIA已經(jīng)與伯克利實(shí)驗(yàn)室合作,并將其集成到NVIDIA Nsight Compute中。隨著其2020.1版本的發(fā)布,Nsight Compute為HPC應(yīng)用程序的Roofline分析提供了一種更為簡(jiǎn)化的方式,并且更容易與Nsight Compute中的其他功能集成,以便進(jìn)行性能分析。
Using Nsight Compute to collect roofline data
Nsight Compute是一個(gè)CUDA內(nèi)核分析器,它提供詳細(xì)的性能度量和優(yōu)化建議。現(xiàn)在,它還可以收集和顯示Roofline分析數(shù)據(jù)。要在報(bào)告中啟用Roofline圖,請(qǐng)確保在從GUI進(jìn)行分析時(shí)選擇了GPU Speed of Light roofline Chart部分。提供的詳細(xì)或完整的集合包括此部分(圖1)。
Figure 1. Detailed section set in Nsight
Compute.
If you are profiling from the command-line, use the flag --set detailed or --set full.
You can also manually select individual sections with the --section flag. The name of this new section is SpeedOfLight_RooflineChart.
Understanding the application
在本文中,將使用一個(gè)基于BerkeleyGW代碼的小型應(yīng)用程序。以獨(dú)立的方式實(shí)現(xiàn)該應(yīng)用程序的關(guān)鍵科學(xué)工作負(fù)載之一。為了簡(jiǎn)單起見(jiàn),這個(gè)小應(yīng)用程序抽象了部分BerkeleyGW代碼,只運(yùn)行一個(gè)內(nèi)核。可以在GitLab上找到這個(gè)小應(yīng)用程序,以及更詳細(xì)的說(shuō)明,提供試用。
Using roofline analysis step-by-step
GitLab存儲(chǔ)庫(kù)中使用了一些優(yōu)化技術(shù)。為了演示NsightCompute中的所有功能(包括新添加的Roofline分析)如何相互補(bǔ)充以進(jìn)行全面的性能分析,只討論其中的兩個(gè)步驟,步驟1和步驟3。
Baseline
在最初的串行CPU實(shí)現(xiàn)中,核心工作負(fù)載在三層嵌套的Fortran循環(huán)中表示:
do n1_loc = 1, ntband_dist ! O(1000)
do igp = 1, ngpown ! O(1000)
do ig = 1, ncouls ! O(10000)
注釋表示每個(gè)回路的行程計(jì)數(shù)的近似長(zhǎng)度。選擇這種循環(huán)順序是為了以優(yōu)化的模式訪問(wèn)Fortran使用的列主內(nèi)存布局的內(nèi)存,因?yàn)榇a中的許多數(shù)組都是以ig作為第一個(gè)索引,igp或n1_loc作為第二個(gè)索引來(lái)訪問(wèn)的。帶有OpenACC的初始并行端口是GitLab存儲(chǔ)庫(kù)中提供的基線代碼,如下所示,它折疊了三個(gè)循環(huán),試圖利用GPU上的大規(guī)模并行硬件。結(jié)果如下所示:
!$ACC PARALLEL LOOP GANG VECTOR reduction(+:…)
collapse(3)
do n1_loc = 1, ntband_dist ! O(1000)
do igp = 1, ngpown ! O(1000)
do ig = 1, ncouls ! O(10000)
圖2中的初始roofline分析表明,內(nèi)核的算術(shù)強(qiáng)度很低,足以低于圖表中的傾斜內(nèi)存限制roofline。實(shí)現(xiàn)的運(yùn)算強(qiáng)度為7.39 FLOP/byte,但V100雙精度機(jī)器平衡點(diǎn)的算術(shù)強(qiáng)度為7.5。在這一點(diǎn)上,做了足夠多的準(zhǔn)備工作,使之成為計(jì)算界compute-bound。可能希望將算術(shù)強(qiáng)度增加到足以低于某個(gè)水平計(jì)算限制的上限。提供了一個(gè)更好的機(jī)會(huì)來(lái)最大化這個(gè)內(nèi)核的計(jì)算性能。
Figure 2. Baseline roofline analysis chart.
roofline圖表還顯示了單精度浮點(diǎn)運(yùn)算的數(shù)據(jù)點(diǎn)。編譯器會(huì)為這個(gè)內(nèi)核生成一些這樣的代碼。它顯示單個(gè)精確Roofline的水平線,即兩條水平線中較高的一條。
Step 1: Unroll certain loops to gain arithmetic intensity
第三個(gè)循環(huán)的核心循環(huán)是連續(xù)運(yùn)行的,這是第三個(gè)循環(huán)的循環(huán)。因?yàn)槿魏我粚?duì)循環(huán)都會(huì)暴露至少一百萬(wàn)個(gè)自由度,所以仍然應(yīng)該有足夠的并行性來(lái)飽和高端GPU。要選擇哪一個(gè),可注意代碼的內(nèi)存訪問(wèn)模式。對(duì)于所有多維數(shù)組,n1_loc在訪問(wèn)之間的跨距最大,這也是由于column-major Fortran layout布局造成的。有效地使用GPU內(nèi)存帶寬需要合并訪問(wèn),其中連續(xù)線程訪問(wèn)內(nèi)存中的連續(xù)位置。所以,這都意味著n1_loc循環(huán)是這個(gè)實(shí)驗(yàn)最符合邏輯的目標(biāo)。
!$ACC PARALLEL LOOP GANG VECTOR reduction(+:…)
collapse(2) do igp = 1, ngpown ! O(1000)
do ig = 1, ncouls ! O(10000)
!$ACC LOOP SEQ
do n1_loc = 1, ntband_dist ! O(1000)
當(dāng)進(jìn)行此更改時(shí),內(nèi)核實(shí)際上并沒(méi)有加速。事實(shí)上,運(yùn)行時(shí)的速度下降了10%,從1.74秒降到了1.92秒,但是,現(xiàn)在已經(jīng)確定了內(nèi)核的計(jì)算極限,雙倍精度的算術(shù)強(qiáng)度大約為20當(dāng)您進(jìn)行此更改時(shí),內(nèi)核實(shí)際上并沒(méi)有加速。事實(shí)上,運(yùn)行時(shí)的速度下降了10%,從1.74秒降到了1.92秒,但是,你現(xiàn)在已經(jīng)確定了內(nèi)核的計(jì)算極限,雙倍精度的算術(shù)強(qiáng)度大約為20浮點(diǎn)/字節(jié)(圖3)。圖4顯示了Nsight計(jì)算光速部分的內(nèi)存利用率也低得多,基線(紅色)為34%,第1步優(yōu)化后為11%(藍(lán)色)。這意味著,如果你能使計(jì)算更有效,你也許能更接近峰值(圖3)。圖4顯示了Nsight計(jì)算Speed of Light光速部分的內(nèi)存利用率也低得多,基線(紅色)為34%,第1步優(yōu)化后為11%(藍(lán)色)。這意味著,如果能使計(jì)算更有效,也許能更接近峰值。
Figure 3. Roofline chart after Step 1.
Figure 4. Comparison of SM and memory
utilization between baseline and step 1.
Step 3: Avoid high-latency instructions
高延遲指令可以顯著降低warp問(wèn)題的發(fā)生率并降低計(jì)算并發(fā)性,特別是當(dāng)沒(méi)有足夠的線程來(lái)隱藏延遲時(shí)。但是,可以應(yīng)用某些技巧來(lái)用較低延遲的指令替換這些指令。這里,演示兩個(gè),其中兩個(gè)復(fù)數(shù)的除法wtilde和wdiff替換為倒數(shù),ssx和I_eps_數(shù)組的絕對(duì)值計(jì)算被指數(shù)計(jì)算代替,因?yàn)橹挥糜趇f/else條件評(píng)估。
! before delw = wtilde / wdiff
! after wdiffr = wdiff * CONJG(wdiff)
rden = 1.0d0 / wdiffr delw = wtilde * CONJG(wdiff) *
rden
!before
ssxcutoff = sexcut *abs(I_eps_array(ig,igp))
if (abs(ssx) .gt. ssxcutoff .and. wx_array_t(iw,n1_loc).lt. 0.0d0) ssx=0.0d0 !
after
ssxcutoff = sexcut**2* I_eps_array(ig,igp) * CONJG(I_eps_array(ig,igp))
rden = ssx * CONJG(ssx)
if (rden .gt. ssxcutoff .and. wx_array_t(iw,n1_loc) .lt.
0.0d0) ssx=0.0d0
通過(guò)應(yīng)用這些技巧,計(jì)算性能從2.5tflop/s提高到2.9tflop/s,代碼的運(yùn)行速度提高了一倍。運(yùn)算強(qiáng)度已經(jīng)下降到6.3 FLOP/byte,使得GPP重新回到帶寬限制區(qū)域。這不是一個(gè)嚴(yán)重的問(wèn)題,因?yàn)樗谛阅軆?yōu)化過(guò)程中經(jīng)常發(fā)生。隨著計(jì)算并發(fā)性的增加,需要讀寫(xiě)更多的數(shù)據(jù)來(lái)滿足計(jì)算需求。這可能會(huì)增加內(nèi)存帶寬的使用,從而導(dǎo)致帶寬限制更大的Roofline圖。
Figure 5. Roofline chart of GPP before applying tricks in Step 3.
Figure 6. Roofline chart of GPP after Step 3.
NsightCompute中豐富的特征集是相輔相成的,這種優(yōu)化的效果也可以通過(guò)其他度量來(lái)驗(yàn)證。圖7和圖8顯示,由于將delw=wtilde/wdiffr替換為rden=1.0d0/wdiffr,sampled active warps(全部或未發(fā)出)的數(shù)量和狀態(tài)為wait(綠色條)的warp數(shù)量都顯著下降。第三步的abs trick技巧也有同樣的效果。
Figure 7. Change in sampling data after optimization transformations.
Figure 8. Another change in sampling data after optimization transformations.
Introducing hierarchical roofline analysis
到目前為止,文章展示了傳統(tǒng)的Roofline模型,它只為GPU DRAM內(nèi)存使用一個(gè)內(nèi)存Roofline。然而,內(nèi)存子系統(tǒng)比這更復(fù)雜,可以擴(kuò)展Roofline模型來(lái)合并GPU的L1和L2緩存。這種分層Roofline模型在前面鏈接的論文中有詳細(xì)描述。目前,Nsight Compute不支持分層Roofline模型,但它提供了一個(gè)可擴(kuò)展的接口,允許創(chuàng)建自己的實(shí)現(xiàn)(圖9)。使用GitLab存儲(chǔ)庫(kù)中的SpeedOfLight_HierarchicalDoubleRooflineChart部分文件,可以為步驟3創(chuàng)建一個(gè)分層的Roofline圖表。
Figure 9. Hierarchical Roofline created with customized section files for Nsight Compute.
附加的對(duì)角線ceilings頂層表示給定算術(shù)強(qiáng)度的L1和L2性能限制。在這個(gè)圖中,每個(gè)圓表示內(nèi)存子系統(tǒng)(L1、L2或DRAM)的不同級(jí)別,并使用來(lái)自該級(jí)別的流量來(lái)計(jì)算其算術(shù)強(qiáng)度。例如,紅點(diǎn)代表一級(jí)緩存,用內(nèi)核的總浮點(diǎn)數(shù)除以一級(jí)緩存中移入和移出的字節(jié)數(shù)繪制。分層Roofline更詳細(xì)地說(shuō)明內(nèi)存層次結(jié)構(gòu)的哪個(gè)級(jí)別可能是瓶頸。此信息允許調(diào)整內(nèi)存布局或訪問(wèn)模式以減少這些性能問(wèn)題。
Summary
提高應(yīng)用程序性能是一個(gè)迭代過(guò)程。了解內(nèi)核所在的roofline圖表部分是指導(dǎo)后續(xù)開(kāi)發(fā)工作的關(guān)鍵技能。例如,如果看到明顯地處于roofline圖表中內(nèi)存帶寬受限的部分,那么最重要的事情就是內(nèi)存訪問(wèn)模式,這樣就可以避免浪費(fèi)時(shí)間查看那些不會(huì)實(shí)質(zhì)性地改變運(yùn)行時(shí)的內(nèi)核部分。此外,了解在每個(gè)迭代中的位置對(duì)于知道何時(shí)停止并繼續(xù)下一個(gè)工作項(xiàng)非常重要。Roofline分析,結(jié)合Nsight Compute提供的其他分析部分,可以幫助了解內(nèi)核相對(duì)于可達(dá)到的峰值系統(tǒng)限制的性能,因此值得將此工具添加到工具箱中。
對(duì)于那些對(duì)更深入感興趣的人,文章只觸及了roofline分析所能達(dá)到的表面。NERSC網(wǎng)站上有更多關(guān)于Roofline模型的詳細(xì)信息,以及他們?nèi)绾问褂盟鼇?lái)分析和提高性能。GitLab repo描述了另外兩個(gè)優(yōu)化步驟,可以使用最新版本的Nsight
Compute進(jìn)行實(shí)驗(yàn)。
總結(jié)
以上是生活随笔為你收集整理的用NVIDIA NsightcComputeRoofline分析加速高性能HPC的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Pipe Utilization管道利用
- 下一篇: 使用PCAST检测散度以比较GPU和CP