這是標(biāo)準(zhǔn)并行編程系列的第四篇文章,旨在指導(dǎo)開(kāi)發(fā)人員在標(biāo)準(zhǔn)語(yǔ)言中使用并行來(lái)加速計(jì)算的優(yōu)勢(shì):
● 使用標(biāo)準(zhǔn)語(yǔ)言并行性開(kāi)發(fā)加速代碼
● 用標(biāo)準(zhǔn)并行 C++進(jìn)行多 GPU 編程,第 1 部分
● 用標(biāo)準(zhǔn)并行 C++進(jìn)行多 GPU 編程,第 2 部分
標(biāo)準(zhǔn)語(yǔ)言已經(jīng)開(kāi)始添加編譯器可用于加速 GPU 和 CPU 并行編程的功能,例如 Fortran 中的 do concurrent 循環(huán)和數(shù)組數(shù)學(xué)內(nèi)部函數(shù)。
使用標(biāo)準(zhǔn)語(yǔ)言特性有許多優(yōu)點(diǎn),主要優(yōu)點(diǎn)是未來(lái)的可驗(yàn)證性。由于 Fortran 的 do concurrent 是一種標(biāo)準(zhǔn)語(yǔ)言功能,因此將來(lái)失去支持的可能性很小。
這個(gè)特性在初始代碼開(kāi)發(fā)中使用起來(lái)也相對(duì)簡(jiǎn)單,并且增加了可移植性和并行性。在初始代碼開(kāi)發(fā)中使用 do concurrent 有助于鼓勵(lì)您在編寫(xiě)和實(shí)現(xiàn)循環(huán)時(shí)從一開(kāi)始就考慮并行性。
對(duì)于初始代碼開(kāi)發(fā),do concurrent 是添加 GPU 支持的好方法,無(wú)需學(xué)習(xí)指令。然而,即使是已經(jīng)通過(guò)使用 OpenACC 和 OpenMP 等指令進(jìn)行 GPU 加速的代碼,也可以從重構(gòu)到標(biāo)準(zhǔn)并行性中獲益,原因如下:
● 為那些不懂指令的人清理代碼,或者刪除大量使源代碼分心的指令。
● 在供應(yīng)商支持和支持壽命方面提高代碼的可移植性。
● 該代碼經(jīng)得起未來(lái)考驗(yàn),因?yàn)?ISO 標(biāo)準(zhǔn)語(yǔ)言在穩(wěn)定性和可移植性方面有著可靠的記錄。
替換多核 CPU 和 GPU 上的指令
POT3D 是一個(gè) Fortran 代碼,它使用表面場(chǎng)觀測(cè)值作為輸入,計(jì)算勢(shì)場(chǎng)解以近似太陽(yáng)日冕磁場(chǎng)。它繼續(xù)被用于日冕結(jié)構(gòu)和動(dòng)力學(xué)的大量研究。
該代碼使用 MPI 進(jìn)行高度并行化,并使用 MPI 和 OpenACC 進(jìn)行 GPU 加速。 它是開(kāi)源的,在 GitHub 上可用 。它也是 SPEHPC 2021 基準(zhǔn)套件 的一部分。
我們最近于 2021 于 WACCPD 舉辦了 使用 do concurrent 重構(gòu)了另一個(gè)代碼示例 。結(jié)果表明,可以用 do concurrent 替換指令,而不會(huì)損失多核 CPU 和 GPU 上的性能。然而,該代碼有點(diǎn)簡(jiǎn)單,因?yàn)闆](méi)有 MPI 。
現(xiàn)在,我們想探索在更復(fù)雜的代碼中替換指令。POT3D 包含標(biāo)準(zhǔn) Fortran 并行處理的重要功能:縮減、原子、 CUDA-aware MPI 和本地堆棧數(shù)組。我們想看看 do concurrent 是否可以替換指令并保持相同的性能。
為了建立將代碼重構(gòu)為 do concurrent 的性能基線,首先查看圖 1 中原始代碼的初始計(jì)時(shí)。CPU 結(jié)果在雙插槽 AMD EPYC 7742 服務(wù)器上的 64 個(gè) MPI 列組(每個(gè)插槽 32 個(gè))上運(yùn)行,而 GPU 結(jié)果在 NVIDIA A100 ( 40GB )服務(wù)器上的一個(gè) MPI 列組上運(yùn)行。GPU 代碼依賴于數(shù)據(jù)傳輸?shù)臄?shù)據(jù)移動(dòng)指令(此處不使用托管內(nèi)存),并使用 -acc=gpu -gpu=cc80、cuda11.5 編譯。運(yùn)行時(shí)間是四次運(yùn)行的平均值。
以下突出顯示的文本顯示了當(dāng)前版本代碼的代碼行數(shù)和指令。您可以看到有 80 條指令,但我們希望通過(guò)使用 do concurrent 重構(gòu)來(lái)減少這一數(shù)字。
圖 1 :原始版本 POT3D 代碼的 CPU 和 GPU 計(jì)時(shí)顯示,在 NVIDIA A100 40GB GPU 上使用 OpenACC 時(shí),原始代碼的掛鐘時(shí)間有了顯著改善
POT3D (Original) | |
Fortran | 3,487 |
Comments | 3,452 |
OpenACC Directives | 80 |
Total | 7,019 |
表 1 :POT3D 的代碼事實(shí),包括 Fortran 、注釋、 OpenACC 指令和總行。
執(zhí)行并發(fā)和 OpenACC
以下是一些與代碼 POT3D 中的 OpenACC 相比的 do concurrent 示例,例如三層嵌套的 OpenACC 并行循環(huán):
!$acc enter data copyin(phi,dr_i)
!$acc enter data create(br)
…
!$acc parallel loop default(present) collapse(3) async(1)
do k=1,np do j=1,nt do i=1,nrm1 br(i,j,k)=(phi(i+1,j,k)-phi(i,j,k))*dr_i(i) enddo enddo
enddo
…
!$acc wait
!$acc exit data delete(phi,dr_i,br)
如前所述,此 OpenACC 代碼使用標(biāo)志 -acc=gpu -gpu=cc80、cuda11.5 進(jìn)行編譯,以在 NVIDIA GPU 上運(yùn)行。
您可以使用 do concurrent 并行化這個(gè)相同的循環(huán),并依賴于 NVIDIA CUDA 統(tǒng)一內(nèi)存 用于數(shù)據(jù)移動(dòng),而不是指令。這將產(chǎn)生以下代碼:
do concurrent (k=1:np,j=1:nt,i=1:nrm1) br(i,j,k)=(phi(i+1,j,k)-phi(i,j,k ))*dr_i(i)
enddo
如您所見(jiàn),循環(huán)已從 12 行壓縮為 3 行,而 CPU 中的 nvfortran 編譯器保留了 CPU 的可移植性和 HPC SDK NVIDIA 的并行性
行數(shù)的減少得益于將多個(gè)循環(huán)壓縮為一個(gè)循環(huán),并依賴于托管內(nèi)存,這將刪除所有數(shù)據(jù)移動(dòng)指令。使用 cuda11.5、cuda11.5 為 GPU 編譯此代碼。
對(duì)于 nvfortran ,激活標(biāo)準(zhǔn)并行(-stdpar=gpu)會(huì)自動(dòng)激活托管內(nèi)存。要使用 OpenACC 指令和 do concurrent 控制數(shù)據(jù)移動(dòng),請(qǐng)使用以下標(biāo)志:-acc=gpu -gpu=nomanaged。
do concurrent 的 nvfortran 實(shí)現(xiàn)還允許定義變量的位置:
do concurrent (k=1:N, j(i)>0) local(M) shared(J,K) M=mod(K(i), J(i)) K(i)=K(i)- M
enddo
這對(duì)于某些代碼可能是必要的。對(duì)于 POT3D ,變量的默認(rèn)位置將根據(jù)需要執(zhí)行。默認(rèn)位置與使用 nvfortran 的 OpenACC 相同。
并行執(zhí)行 CPU 性能和 GPU 實(shí)現(xiàn)
圖 2 顯示了此代碼的 do concurrent 版本在 CPU 上的性能與原始 GitHub 代碼幾乎相同。這意味著您沒(méi)有通過(guò)使用 do concurrent 破壞 CPU 兼容性。相反,還添加了多核并行,可以通過(guò)使用標(biāo)志 -stdpar=multicore 進(jìn)行編譯來(lái)使用。
圖 2 :使用 MPI(每個(gè)插槽 32 個(gè)等級(jí))的 CPU 計(jì)時(shí)用于原始和并發(fā)版本的 POT3D 代碼
與 CPU 不同,要在 GPU 上運(yùn)行 POT3D ,必須添加幾個(gè)指令。
首先,要利用 MPI 的多個(gè) GPU ,需要一個(gè)指令來(lái)指定 GPU 設(shè)備編號(hào)。否則,所有 MPI 級(jí)別將使用相同的 GPU 。
!$acc set device_num(mpi_shared_rank_num)
在本例中,mpi_shared_rank_num 是節(jié)點(diǎn)內(nèi)的 MPI 等級(jí)。假設(shè)啟動(dòng)代碼時(shí),每個(gè)節(jié)點(diǎn)的 MPI 列組數(shù)與每個(gè)節(jié)點(diǎn)的 GPU 數(shù)相同。這也可以通過(guò)為每個(gè) MPI 列組設(shè)置CUDA_VISIBLE_DEVICES 來(lái)實(shí)現(xiàn),但我們更喜歡通過(guò)編程實(shí)現(xiàn)。
將托管內(nèi)存與多個(gè) GPU 一起使用時(shí),請(qǐng)確保在分配任何數(shù)據(jù)之前完成設(shè)備選擇(如!$acc set device_num(N))。否則,將創(chuàng)建額外的 CUDA 上下文,從而引入額外的開(kāi)銷(xiāo)。
目前, nvfortran 編譯器不支持并行循環(huán)上的數(shù)組縮減,這在代碼的兩個(gè)位置都是必需的。幸運(yùn)的是,可以使用 OpenACC 原子指令代替數(shù)組縮減:
do concurrent (k=2:npm1,i=1:nr)
!$acc atomic sum0(i)=sum0(i)+x(i,2,k)*dph(k )*pl_i
enddo
添加此指令后,使用 -stdpar=gpu -acc=gpu -gpu=cc80、cuda11.5 更改編譯器選項(xiàng)以顯式啟用 OpenACC 。這只允許您使用三條 OpenACC 指令。這是該代碼目前最接近沒(méi)有指令的情況。
所有數(shù)據(jù)移動(dòng)指令都是不必要的,因?yàn)樗袛?shù)據(jù)結(jié)構(gòu)都使用了 CUDA 托管內(nèi)存。表 2 顯示了此版本 POT3D 所需的指令數(shù)和代碼行數(shù)。
POT3D (Original) | POT3D (Do Concurrent) | Difference | |
Fortran | 3487 | 3421 | (-66) |
Comments | 3452 | 3448 | (-4) |
OpenACC Directives | 80 | 3 | (-77) |
Total | 7019 | 6872 | (-147) |
表 2 :GPU 兼容的代碼行數(shù)執(zhí)行并發(fā) POT3D 版本,包含 Fortran 行數(shù)、指令和注釋行數(shù)的細(xì)分。
對(duì)于 POT3D 中的歸約循環(huán),您依賴于隱式歸約,但這可能并不總是有效的。最近, nvfortran 添加了即將推出的 Fortran 202X reduce 子句,該子句可用于還原循環(huán),如下所示:
do concurrent (k=1:N) reduce(+:cgdot) cgdot=cgdot+x(i)*y(i)
enddo
GPU 性能、統(tǒng)一內(nèi)存和數(shù)據(jù)移動(dòng)
您已經(jīng)用最少數(shù)量的 OpenACC 指令和依賴托管內(nèi)存進(jìn)行數(shù)據(jù)移動(dòng)的 do concurrent 開(kāi)發(fā)了代碼。這是目前最接近的無(wú)指令代碼。
圖 3 顯示,與原始 OpenACC GPU 代碼相比,此代碼版本的性能下降了約 10% 。造成這種情況的原因可能是 do concurrent , 托管內(nèi)存或兩者的組合。
圖 3 :GPU GitHub 和標(biāo)準(zhǔn)并行性( STDPAR )的計(jì)時(shí), OpenACC 最小 NVIDIA A100 40GB GPU 上的 POT3D 代碼版本。
要查看托管內(nèi)存是否會(huì)導(dǎo)致較小的性能損失,請(qǐng)?jiān)趩⒂猛泄軆?nèi)存的情況下編譯原始 GitHub 代碼。這是通過(guò)在 GPU 之前使用的標(biāo)準(zhǔn) OpenACC 標(biāo)志之外使用編譯標(biāo)志 -gpu=managed 來(lái)實(shí)現(xiàn)的。
圖 4 顯示了 GitHub 代碼現(xiàn)在在托管內(nèi)存中的性能與最小指令代碼類(lèi)似。這意味著性能損失較小的罪魁禍?zhǔn)资墙y(tǒng)一內(nèi)存。
圖 4 :GPU GitHub (托管和非托管)和 STDPAR 的計(jì)時(shí), OpenACC 最小 POT3D 代碼的版本
要用最少的指令代碼恢復(fù)原始代碼的性能,必須將數(shù)據(jù)移動(dòng)指令添加回。do concurrent 和數(shù)據(jù)移動(dòng)指令的組合如下代碼示例所示:
!$acc enter data copyin(phi,dr_i)
!$acc enter data create(br)
do concurrent (k=1:np,j=1:nt,i=1:nrm1) br(i,j,k)=(phi(i+1,j,k)-phi(i,j,k ))*dr_i(i)
enddo
!$acc exit data delete(phi,dr_i,br)
這導(dǎo)致代碼有 41 條指令,其中 38 條負(fù)責(zé)數(shù)據(jù)移動(dòng)。要編譯代碼并依賴數(shù)據(jù)移動(dòng)指令,請(qǐng)運(yùn)行以下命令:
-stdpar=gpu -acc=gpu -gpu=cc80,cuda11.5,nomanaged
nomanaged 關(guān)閉托管內(nèi)存,-acc=gpu 打開(kāi)指令識(shí)別。
圖 5 顯示了與原始 GitHub 代碼幾乎相同的性能。此代碼的指令比原始代碼少 50% ,并提供相同的性能!
圖5:POT3D 代碼的 GitHub(托管和非托管)、STDPAR + 最小 OpenACC(托管)和 STDPAR + OpenACC(非托管)版本的 GPU 時(shí)序。
MPI + DO 并行擴(kuò)展
圖 7 顯示了使用多個(gè) GPU 的計(jì)時(shí)結(jié)果。主要的收獲是 do concurrent 在多個(gè) GPU 上與 MPI 一起工作。
查看打開(kāi)托管內(nèi)存的代碼(藍(lán)線),可以看到原始代碼和最小指令代碼的性能與使用多個(gè) GPU 的性能幾乎相同。
查看關(guān)閉托管內(nèi)存的代碼(綠線),您可以再次看到原始 GitHub 代碼和代碼的 do concurrent 版本之間的相同比例。這表明 do concurrent 可以與 MPI 一起工作,并且對(duì)您應(yīng)該看到的縮放沒(méi)有影響。
您可能還注意到,隨著 GPU 的擴(kuò)展,托管內(nèi)存會(huì)導(dǎo)致開(kāi)銷(xiāo)。受管內(nèi)存運(yùn)行(藍(lán)線)和數(shù)據(jù)指令線(綠線)彼此平行,這意味著開(kāi)銷(xiāo)隨著 GPU 的數(shù)量而變化。
圖 6 :GPU GitHub (托管和非托管)、 STDPAR +最小 OpenACC (托管)和 STDPAR + OpenACC (非托管)的 1 、 2 、 4 和 8 GPU 擴(kuò)展 POT3D 代碼的版本
Fortran 標(biāo)準(zhǔn)并行編程綜述
您可能會(huì)想,“標(biāo)準(zhǔn) Fortran 聽(tīng)起來(lái)太好了,不可能是真的,有什么問(wèn)題嗎?”
Fortran 標(biāo)準(zhǔn)并行編程支持更干凈的代碼,并通過(guò)依賴 ISO 語(yǔ)言標(biāo)準(zhǔn)提高代碼的未來(lái)證明性。使用最新的 nvfortran 編譯器,您可以獲得前面提到的所有好處。
雖然您在過(guò)渡到 do concurrent 時(shí)失去了當(dāng)前的 GCC OpenACC / MP GPU 支持,但隨著其他供應(yīng)商在 GPU 上增加對(duì) do concurrent 的支持,我們預(yù)計(jì)將來(lái)會(huì)獲得更多的 GPU 支持。鑒于 ISO 語(yǔ)言標(biāo)準(zhǔn)的歷史記錄,我們相信這種支持會(huì)到來(lái)。
使用 do concurrent 目前確實(shí)存在一些限制,即缺乏對(duì)原子、設(shè)備選擇、異步或優(yōu)化數(shù)據(jù)移動(dòng)的支持。然而,正如我們所展示的,這些限制中的每一個(gè)都可以使用編譯器指令輕松解決。由于 Fortran 中的本機(jī)并行語(yǔ)言特性,所需的指令要少得多。
準(zhǔn)備好開(kāi)始了嗎? 下載免費(fèi)的 NVIDIA HPC SDK ,然后開(kāi)始測(cè)試!如果您還對(duì)我們的研究結(jié)果感興趣,請(qǐng)參閱 從指令到并行:標(biāo)準(zhǔn)并行的一個(gè)案例研究 GTC 課程。有關(guān)標(biāo)準(zhǔn)語(yǔ)言并行性的更多信息,請(qǐng)參閱 使用標(biāo)準(zhǔn)語(yǔ)言并行性開(kāi)發(fā)加速代碼 。
確認(rèn)書(shū)
這項(xiàng)工作得到了國(guó)家科學(xué)基金會(huì)、 NASA 和空軍科學(xué)研究辦公室的支持。計(jì)算資源由圣地亞哥州立大學(xué)計(jì)算科學(xué)資源中心提供。
*本文轉(zhuǎn)自 NVIDIA英偉達(dá)
3DEXPERIENCE公司DassaultSystèmes已發(fā)布SIMULIA Suite 2020的修補(bǔ)程序1
DS SIMULIA Suite 2020(Abaqus / Isight / Fe-safe / Tosca)是一種高級(jí)應(yīng)用程序,使用各種工程和分析工具進(jìn)行設(shè)計(jì)和開(kāi)發(fā),以解決問(wèn)題。用戶可以在各種線性和非線性建模分析中使用該應(yīng)用程序,以獲得更好的結(jié)果和輸出。它為用戶提供了分析其他機(jī)械和工程過(guò)程的信息,例如處理愈合轉(zhuǎn)移,熱部件管理等。
DS SIMULIA Suite 2020(Abaqus / Isight / Fe-safe / Tosca)是一種簡(jiǎn)單的解決方案,具有專(zhuān)業(yè)的圖形環(huán)境以及優(yōu)化的任務(wù)和工具。用戶可以提高他們的分析技能,學(xué)習(xí)新工具并改善他們的工作流程。該應(yīng)用程序具有準(zhǔn)確和高級(jí)的建模和仿真功能,而錯(cuò)誤率幾乎沒(méi)有。該應(yīng)用程序包含在模型庫(kù)中,該庫(kù)包含元素和組件,例如金屬,輪胎,聚合物,復(fù)合材料,混凝土以及其他土力工程材料,包括土壤和巖石。
在3DEXPERIENCE平臺(tái)的支持下,SIMULIA提供了逼真的仿真應(yīng)用程序,使用戶能夠揭示我們生活的世界。SIMULIA應(yīng)用程序在致力于物理原型之前加快了評(píng)估材料和產(chǎn)品的性能,可靠性和安全性的過(guò)程。仿真產(chǎn)品組合,包括Abaqus,Isight,fe-safe,Tosca,Simpoe-Mold,SIMPACK,CST Studio Suite,XFlow,PowerFLOW等。
功能:
Abaqus:一個(gè)強(qiáng)大而完整的仿真程序包,可用于需要結(jié)構(gòu)仿真的工業(yè)過(guò)程的常規(guī)和復(fù)雜問(wèn)題解決。這種可擴(kuò)展的統(tǒng)一分析產(chǎn)品套件允許所有用戶,無(wú)論其模擬專(zhuān)業(yè)知識(shí)或領(lǐng)域重點(diǎn)如何,都可以協(xié)作并無(wú)縫共享模擬數(shù)據(jù)和認(rèn)可的方法,而不會(huì)損失信息保真度。
fe-safe:Abaqus產(chǎn)品組合中提供的強(qiáng)大而全面的功能,可用于有限元模型的疲勞分析。它與商業(yè)結(jié)構(gòu)分析(FEA)軟件一起使用,以計(jì)算疲勞裂紋何時(shí)何地發(fā)生以及它們是否會(huì)傳播,并預(yù)測(cè)使用壽命變化,并被汽車(chē),重型卡車(chē),非公路,船舶等領(lǐng)先公司所使用。 ,國(guó)防,海上,發(fā)電,風(fēng)能,醫(yī)學(xué)工程等許多行業(yè)。
Tosca:Abaqus產(chǎn)品組合中提供的集成拓?fù)洌螤詈痛胖閮?yōu)化技術(shù)。考慮到使用中的負(fù)載情況,Tosca用于優(yōu)化結(jié)構(gòu)的拓?fù)洌螤詈椭樽硬季郑詼p輕重量和成本,增加強(qiáng)度并最大程度地延長(zhǎng)使用壽命。
Isight / SEE:工業(yè)過(guò)程自動(dòng)化和設(shè)計(jì)優(yōu)化軟件,提供使用戶減少分析時(shí)間和成本,同時(shí)提高產(chǎn)品性能,質(zhì)量和可靠性的解決方案。 SIMULIA執(zhí)行引擎(SEE)提供了最新的Fiper技術(shù),用于分發(fā)和并行化仿真過(guò)程流。這些共同使客戶可以建立一個(gè)基于Web的框架,以分布仿真過(guò)程的執(zhí)行,以優(yōu)化計(jì)算資源并實(shí)現(xiàn)整個(gè)企業(yè)的協(xié)作。
*發(fā)布信息:
-ABAQUS.CAA.2020.HF1.Update.Only.Win64.iso
-ABAQUS.CAE.2020.HF1.Update.Only.Win64.iso
-ABAQUS.CAA.CAE.2020.HF1.Update.Only.Linux64.tar
-DS.SIMULIA.2020.HF1.Doc.Update.Only.iso(Win / Linux)
電腦配置需求:
Windows操作系統(tǒng)Windows 10專(zhuān)業(yè)版和企業(yè)版Windows Server 2012 R2、2016 (帶有或不帶有HPC Pack)處理器 x86-64 Intel或AMDC ++編譯器 Visual Studio 2017(15.9.4)FORTRAN編譯器 Intel Visual Fortran 16.0 Update 1MPI和Microsoft的互連 MPIMicrosoft MPI和受支持的互連Workload Manager Windows HPC(僅Windows Server)GPGPU選擇NVIDIA和AMD
Linux操作系統(tǒng)Red Hat Enterprise Linux Server版本7SUSE Linux Enterprise Server 12處理器 x86-64 Intel或AMDC ++編譯器 GCCFORTRAN編譯器 Intel Visual Fortran 16.0 Update 1MPI并互連 IBM Platform MPI(提供)和受支持的互連Workload Manager IBM Spectrum LSFGPGPU選擇NVIDIA和AMD
安裝教程:
建議下載和安裝之前關(guān)閉防火墻和殺毒軟件,安裝的時(shí)候斷開(kāi)網(wǎng)絡(luò)。
安裝SIMULIA Suite 2020 HF1升級(jí)補(bǔ)丁!需先安裝:
DS SIMULIA Suite 2020(Abaqus / Isight / Fe-safe / Tosca)x64DS SIMULIA Suite 2020(Abaqus / Isight / Fe-safe / Tosca)Linux
僅更新!
要安裝它,您需要預(yù)安裝破解版的DS SIMULIA ABAQUS 2020 Win64
如需視頻安裝教程,請(qǐng)私信小編推薦下載地址。
如需相關(guān)培訓(xùn)教程,請(qǐng)?jiān)谠u(píng)論區(qū)留言,1個(gè)人需要,小
編也會(huì)接著推送相關(guān)培訓(xùn)教程。
你們的留言,小編的動(dòng)力。
轉(zhuǎn)載自 caxfwz.com