91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

多個(gè)GPU標(biāo)準(zhǔn)C++并行編程加速計(jì)算的優(yōu)點(diǎn)

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:NVIDIA ? 2022-04-27 17:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這是 標(biāo)準(zhǔn)并行編程 系列的第二篇文章,講述在標(biāo)準(zhǔn)語(yǔ)言中使用并行性來(lái)加速計(jì)算的優(yōu)點(diǎn)。

用標(biāo)準(zhǔn)語(yǔ)言并行性開(kāi)發(fā)加速代碼

多個(gè) GPU 標(biāo)準(zhǔn) C ++并行編程,第 2 部分

將應(yīng)用程序移植到 GPU 的難度因情況而異。在最佳情況下,您可以通過(guò)調(diào)用現(xiàn)有的 GPU 優(yōu)化庫(kù)來(lái)加速關(guān)鍵代碼部分。例如,當(dāng)模擬軟件的構(gòu)建塊由 BLAS 線性代數(shù)函數(shù)組成時(shí),可以使用 cuBLAS 對(duì)其進(jìn)行加速。

但在許多代碼中,你不能四處做一些手工工作。在這些場(chǎng)景中,您可以考慮使用特定于域的語(yǔ)言,例如 CUDA 來(lái)針對(duì)特定的加速器?;蛘?,您可以使用基于指令的方法,如 OpenMP 或 OpenACC ,以保持原始語(yǔ)言,并使用相同的代碼針對(duì)主機(jī)和各種類(lèi)型的設(shè)備。

標(biāo)準(zhǔn)并行性

隨著本機(jī)形式的并行在C++、FORTRAN和 Python 編程語(yǔ)言的現(xiàn)代版本中的出現(xiàn),現(xiàn)在可以利用類(lèi)似的高級(jí)方法而不需要語(yǔ)言擴(kuò)展。

C ++中的標(biāo)準(zhǔn)并行性

我們的重點(diǎn)是 C ++語(yǔ)言,它作為 C ++ 17 標(biāo)準(zhǔn),在標(biāo)準(zhǔn)庫(kù)中提供了許多算法的并行版本。底層編程模型是前面提到的兩種方法的混合體。它的工作方式類(lèi)似于基于庫(kù)的方法,因?yàn)?C ++提供了用于排序、搜索和累積和的常見(jiàn)任務(wù)的并行算法,并且可以在即將到來(lái)的版本中添加對(duì)特定領(lǐng)域特定算法的支持。此外,以通用for_each和transform_reduce算法的形式提供了并行手寫(xiě)循環(huán)的形式。

C ++并行算法通過(guò)語(yǔ)言的本地語(yǔ)法來(lái)代替非標(biāo)準(zhǔn)擴(kuò)展來(lái)表示并行性。通過(guò)這種方式,它們保證了所開(kāi)發(fā)軟件的長(zhǎng)期兼容性和可移植性。這篇文章還表明,獲得的性能通常與 CUDA C ++等傳統(tǒng)方法獲得的性能相當(dāng)。

這種方法的新穎之處在于它無(wú)縫地集成到現(xiàn)有的代碼庫(kù)中。此方法允許您保留軟件體系結(jié)構(gòu),并有選擇地加快關(guān)鍵組件的性能。

將 C ++項(xiàng)目移植到 GPU 可以簡(jiǎn)單到通過(guò)調(diào)用for_each或transform_reduce來(lái)替換所有的循環(huán),如果它包含了一個(gè)還原。

我們將通過(guò)典型的重構(gòu)步驟來(lái)克服當(dāng)前 C ++編譯器不兼容問(wèn)題。這篇文章列出了出于性能原因所需的修改,這些修改更具普遍性,原則上獨(dú)立于編程形式。這包括以允許合并內(nèi)存訪問(wèn)的方式重新構(gòu)造數(shù)據(jù)的要求。

對(duì)于當(dāng)前編譯器, C ++并行算法只針對(duì)單個(gè) GPU ,而需要明確的 MPI 并行性來(lái)針對(duì)多個(gè) GPU 。為此,重用現(xiàn)有并行 CPU 代碼的 MPI 后端非常簡(jiǎn)單,我們將介紹一些實(shí)現(xiàn)最先進(jìn)性能的指導(dǎo)原則。

我們將討論這些實(shí)施規(guī)則、指南和最佳實(shí)踐,并以 Palabos 為例進(jìn)行說(shuō)明, Palabos 是一個(gè)基于晶格玻爾茲曼方法( LBM )的計(jì)算流體力學(xué)軟件庫(kù)。 PalabOS 在 2021 中被移植到多個(gè) GPU 硬件中,只有幾個(gè)月的工作,并且說(shuō)明了對(duì)于原來(lái)的代碼很難適應(yīng) GPU 的建議重構(gòu)步驟的需要。由于廣泛使用面向?qū)ο蟮臄?shù)據(jù)結(jié)構(gòu)和編碼機(jī)制,原始代碼對(duì) GPU 的適應(yīng)性較差。

您知道使用 C ++標(biāo)準(zhǔn)并行性允許混合算法,其中一些算法在 GPU 上執(zhí)行,但有些算法保持在 CPU 上。這完全取決于它們是否適合 GPU 執(zhí)行,或者僅僅取決于它們的 GPU 端口的進(jìn)度狀態(tài)。這一特性突出顯示了 C ++標(biāo)準(zhǔn)并行性的主要優(yōu)點(diǎn)之一,與保持原有體系結(jié)構(gòu)和大部分軟件代碼的完整性保持一致。

使用 C ++標(biāo)準(zhǔn)并行編程的 GPU 程序設(shè)計(jì)

如果這是您第一次聽(tīng)到 C ++并行算法,您可能想讀 用標(biāo)準(zhǔn)語(yǔ)言并行性開(kāi)發(fā)加速代碼 ,它介紹了 C ++中的標(biāo)準(zhǔn)語(yǔ)言并行性的主題, FORTRAN 和 Python 。

基本概念非常簡(jiǎn)單。您可以通過(guò)執(zhí)行策略來(lái)獲得許多標(biāo)準(zhǔn)的 C ++算法在主機(jī)上或設(shè)備上并行運(yùn)行,作為一個(gè)額外的參數(shù)提供給算法。在本文中,我們使用par_unseq execution policy,它表示對(duì)不同元素的計(jì)算是完全獨(dú)立的。

以下代碼示例執(zhí)行并行操作,將std::vector《double》的所有元素乘以 2 :

for_each(execution::par_unseq, begin(v), end(v), [](double& x) { x *= 2.0;

});

該算法由nvc++ compiler和-stdpar option編譯,在 GPU 上執(zhí)行。根據(jù)編譯器、編譯器選項(xiàng)和并行算法的實(shí)現(xiàn),還可以在多核 CPU 或其他類(lèi)型的加速器上獲得多線程執(zhí)行。

此示例使用通用的for_each算法,該算法以函數(shù)對(duì)象的形式將任何元素操作應(yīng)用于向量 v 。在本例中,它是一個(gè)內(nèi)聯(lián) lambda 表達(dá)式。可以使用算法transform_reduce而不是for_each來(lái)指定額外的縮減操作。

在for_each算法調(diào)用中,調(diào)用 lambda 函數(shù)時(shí)會(huì)引用連續(xù)的容器元素。但有時(shí),為了訪問(wèn)外部數(shù)據(jù)數(shù)組或?qū)崿F(xiàn)非本地模板,還必須知道元素的索引。

這可以通過(guò)在 C ++ C ++ 17 中的推力庫(kù)(包括NVIDIA HPC SDK )和std::ranges::views::iota中提供的counting_iterator迭代來(lái)完成,或者在 C ++ 20 中更新。在 C ++ 17 中,最簡(jiǎn)單的解決方案是從當(dāng)前元素的地址推導(dǎo)索引。

使用 C ++標(biāo)準(zhǔn)并行性的雅可比示例

為了說(shuō)明這些概念,下面是一個(gè)代碼示例,它使用并行 STL 計(jì)算非局部模具操作和誤差估計(jì)的縮減操作。它執(zhí)行雅可比迭代,計(jì)算每個(gè)矩陣元素的四個(gè)最近鄰的平均值:

void jacobi_iteration(vector const& v, vector& tmp) { double const* vptr = v.data(); double *tmp_ptr = tmp.data(); double l2_error = transform_reduce(execution::par_unseq, begin(v), end(v), 0., plus, [=](double& x) { int i = &x - vptr; // Compute index of x from its address. auto [iX, iY] = split(i); double avg = 0.25 * ( vptr[fuse(iX-1, iY)] + vptr[fuse(iX+1, iY)] + vptr[fuse(iX, iY-1)] + vptr[fuse(iX, iY+1)] ); tmp_ptr[i] = avg; return (avg – x) * (avg – x); } );
)

這里,split表示將線性索引i分解為 x 坐標(biāo)和 y 坐標(biāo),fuse則相反。如果域是一個(gè)統(tǒng)一的nx-by-ny矩陣, Y 索引在內(nèi)存中順序運(yùn)行,則定義如下:

fuse = [ny](int iX, int iY) { return iY + ny * iX; }

split = [ny](int i) { return make_tuple(i / ny, i % ny); }

當(dāng)算法同時(shí)執(zhí)行時(shí),使用臨時(shí)向量存儲(chǔ)計(jì)算出的平均值可以保證確定性結(jié)果。

此代碼的完整和通用版本可從 gitlab.com/unigehpfs/paralg GitLab 存儲(chǔ)庫(kù)獲得。該存儲(chǔ)庫(kù)還包括一個(gè)混合版本( C ++標(biāo)準(zhǔn)并行和 MPI ),它是圍繞本文提供的建議構(gòu)建的,在多個(gè) GPU 上高效運(yùn)行。

您可能已經(jīng)注意到,沒(méi)有明確的語(yǔ)句將數(shù)據(jù)從主機(jī)傳輸?shù)皆O(shè)備,然后再傳輸回來(lái)。 C ++標(biāo)準(zhǔn)實(shí)際上不提供任何這樣的語(yǔ)句,并且任何并行算法在一個(gè)設(shè)備上的實(shí)現(xiàn)必須依賴(lài)于自動(dòng)存儲(chǔ)器傳輸。通過(guò)NVIDIA HPC SDK ,這是通過(guò) CUDA 統(tǒng)一內(nèi)存,從 CPU 和 GPU 訪問(wèn)的單個(gè)存儲(chǔ)器地址空間來(lái)實(shí)現(xiàn)的。如果代碼在 CPU 上訪問(wèn)此地址空間中的數(shù)據(jù),然后在 GPU 上訪問(wèn),則內(nèi)存頁(yè)會(huì)自動(dòng)遷移到訪問(wèn)處理器。

對(duì)于使用 GPU 加速 CPU 應(yīng)用程序, CUDA 統(tǒng)一內(nèi)存特別有用,因?yàn)樗鼓軌驅(qū)W⒂谝栽隽糠绞街饌€(gè)函數(shù)移植應(yīng)用程序的算法,而無(wú)需擔(dān)心內(nèi)存管理。

另一方面,隱藏?cái)?shù)據(jù)傳輸?shù)男阅荛_(kāi)銷(xiāo)很容易抵消 GPU 的性能優(yōu)勢(shì)。通常,在 GPU 上生成的數(shù)據(jù)應(yīng)盡可能保存在 GPU 內(nèi)存中,通過(guò)并行算法調(diào)用表示其所有操作。這包括數(shù)據(jù)后處理,如數(shù)據(jù)統(tǒng)計(jì)計(jì)算和可視化。如本文 Part 2 所示,它還包括 MPI 通信的數(shù)據(jù)打包和解包。

按照這篇文章的建議,將代碼移植到 GPU 變得非常簡(jiǎn)單,只需通過(guò)調(diào)用并行算法來(lái)替換所有時(shí)間關(guān)鍵的循環(huán)和相關(guān)的數(shù)據(jù)訪問(wèn)。不過(guò),最好記住, GPU 通常比 CPU 擁有更多的內(nèi)核,并且應(yīng)該暴露在更高級(jí)別的并行性中。例如,在下一節(jié)介紹的流體動(dòng)力學(xué)問(wèn)題中,流體域被均勻的、類(lèi)似矩陣的網(wǎng)格部分覆蓋。

在原始的 CPU 代碼中,每個(gè) CPU 核心按順序處理一個(gè)或多個(gè)網(wǎng)格部分,如圖 1 頂部所示。至于 GPU ,網(wǎng)格部分元素上的環(huán)路應(yīng)該并行,以完全占據(jù) GPU 核心。

示例: Lattice Boltzmann 軟件和 Palabos

LBM 采用顯式時(shí)間步格式求解流體流動(dòng)方程,涵蓋了廣泛的應(yīng)用。這包括經(jīng)過(guò)復(fù)雜幾何形狀的流動(dòng),如多孔介質(zhì)、多相流、可壓縮超音速流等。

LBM 通常比其他解算器在數(shù)值網(wǎng)格的每個(gè)節(jié)點(diǎn)上分配更多變量。當(dāng)經(jīng)典的不可壓縮 Navier-Stokes 解算器僅用三個(gè)變量表示速度分量,外加一個(gè)臨時(shí)壓力項(xiàng)時(shí), LBM 方法通常需要 19 個(gè)變量,稱(chēng)為populations。因此, LBM 的內(nèi)存占用空間要高出 5-6 倍。如果 Navier Stokes 解算器使用臨時(shí)變量,或者如果系統(tǒng)中添加了進(jìn)一步的物理量(如密度和溫度),實(shí)際里程可能會(huì)有所不同。

因此,豐富的內(nèi)存訪問(wèn)和較低的運(yùn)算強(qiáng)度是 LBM 的特點(diǎn)。在集群級(jí) GPU ,像 NVIDIA V100 和 NVIDIA A100 一樣,性能完全受限于內(nèi)存訪問(wèn),甚至對(duì)于計(jì)算密集和復(fù)雜的 LBM 方案也是如此。

以 NVIDIA A100 40 GB GPU為例,它具有1555 Gb/s的內(nèi)存帶寬。在每一個(gè)明確的時(shí)間步長(zhǎng),每個(gè)節(jié)點(diǎn)訪問(wèn)19個(gè)變量或[EZX27 ],每個(gè)都占用八個(gè)字節(jié),每個(gè)都是雙精度的。它們被計(jì)數(shù)兩次:一次用于從 GPU 內(nèi)存到 GPU 內(nèi)核的數(shù)據(jù)傳輸,另一次用于在計(jì)算操作后寫(xiě)回 GPU 內(nèi)存。

假設(shè)一個(gè)完美的內(nèi)存子系統(tǒng)和最大的數(shù)據(jù)重用, LBM 的峰值吞吐量性能為每秒處理 1555 /( 19 * 8 * 2 )= 51.1 億個(gè)網(wǎng)格節(jié)點(diǎn)。在 LBM 術(shù)語(yǔ)中,通常使用每秒千兆晶格節(jié)點(diǎn)更新( GLUPS ),例如 5.11 GLUPS 。

然而,在現(xiàn)實(shí)生活中的應(yīng)用程序中,每個(gè)節(jié)點(diǎn)都會(huì)額外讀取一些信息來(lái)管理域異常情況。在 Palabos 中,這是節(jié)點(diǎn)標(biāo)記的 32 位整數(shù)和額外數(shù)據(jù)數(shù)組的 64 位索引,有效地將峰值性能降低到 4.92 GLUPS 。

該模型提供了一種簡(jiǎn)單的方法來(lái)估計(jì) LBM 代碼可以達(dá)到的最佳峰值性能,因?yàn)榫彺嬷胁贿m合足夠大的網(wǎng)格。我們?cè)谡麄€(gè)帖子中使用這個(gè)模型來(lái)證明用 C ++并行算法獲得的性能是一樣好的。在幾個(gè)百分點(diǎn)的差距之外,無(wú)論是 CUDA 、 OpenMP ,還是任何其他 GPU 形式主義,都不能做得更好。

LBM 巧妙地區(qū)分了由局部collision step表示的計(jì)算和封裝在streaming step中的內(nèi)存?zhèn)鬏敳僮?。以下代碼示例顯示了具有矩陣式拓?fù)浣Y(jié)構(gòu)的結(jié)構(gòu)化網(wǎng)格的典型時(shí)間迭代:

for (int i = 0; i < N; ++i) { // Fetch local populations "f" from memory. double f_local[19]; for (int k = 0; k < 19; ++k) { f_local[k] = f[i][k]; } collide(f_local); // Execute collision step. // Write data back to neighboring nodes in memory (streaming). auto [iX, iY, iZ] = split(i); for (int k = 0; k < 19; ++k) { int nb = fuse(iX+c[k][0], iY+c[k][1], iZ+c[k][2]); ftmp[nb][k] = f_local[k]; }
}

與前一節(jié)中的 Jacobi 迭代一樣,該函數(shù)將計(jì)算出的數(shù)據(jù)寫(xiě)入temporary array ftmp,以避免多線程執(zhí)行期間出現(xiàn)爭(zhēng)用情況,這使其成為演示本文概念的理想候選。有 替代就地算法 可以避免內(nèi)存復(fù)制。然而,它們更復(fù)雜,因此不太適合用于說(shuō)明目的。

自然過(guò)程的模擬和建模 課程介紹了LBM。有關(guān)如何使用C++并行算法開(kāi)發(fā) GPU 的LBM代碼的更多信息,請(qǐng)參見(jiàn)多核格子玻爾茲曼模擬的跨平臺(tái)編程模型。

在本文中,我們使用 開(kāi)源 LBM 庫(kù) Palabos 來(lái)展示如何將現(xiàn)有的 C ++庫(kù)用并行算法移植到多 GPU 。乍一看, Palabos 似乎不適合 GPU 端口,因?yàn)樗鼜?qiáng)烈依賴(lài)面向?qū)ο蟮臋C(jī)制。然而,在 Palabos 的案例中,我們將介紹幾種變通方法,這些方法只需對(duì)代碼體系結(jié)構(gòu)進(jìn)行表面的更改即可實(shí)現(xiàn)最先進(jìn)的性能。

從面向?qū)ο笤O(shè)計(jì)轉(zhuǎn)向面向數(shù)據(jù)設(shè)計(jì)

為了服務(wù)于大型社區(qū),Palabos強(qiáng)調(diào)多態(tài)性和其他面向?qū)ο蠹夹g(shù)。包含數(shù)據(jù)(種群)和方法(局部碰撞模型)的對(duì)象代表每個(gè)網(wǎng)格節(jié)點(diǎn)。這為開(kāi)發(fā)新模型提供了一個(gè)方便的API,并提供了一個(gè)靈活的機(jī)制來(lái)調(diào)整模型從一個(gè)單元到另一個(gè)單元的物理行為或數(shù)值方面。

然而,由于數(shù)據(jù)布局效率低下、執(zhí)行路徑復(fù)雜,以及對(duì)虛擬函數(shù)調(diào)用的依賴(lài),這種面向?qū)ο蟮姆椒ú惶m合在 GPU 上執(zhí)行。以下幾節(jié)將教您如何通過(guò)采用開(kāi)發(fā)模型,以 GPU 友好的方式重構(gòu)代碼,我們?cè)诳偫ㄐg(shù)語(yǔ)下稱(chēng)之為data-oriented programming。

擺脫基于類(lèi)的多態(tài)性

圖 2 的左半部分展示了 Palabos 中網(wǎng)格節(jié)點(diǎn)上沖突模型的典型代碼執(zhí)行鏈。算法的不同組件被疊加起來(lái),并通過(guò)虛擬函數(shù)調(diào)用,包括底層的數(shù)值 LBM 算法( RR )、附加物理(“ Smagorinsky ”)和附加數(shù)值方面(左邊界)。

這個(gè)面向?qū)ο笤O(shè)計(jì)的教科書(shū)案例變成了代碼 GPU 端口的責(zé)任。這個(gè)問(wèn)題的出現(xiàn)是因?yàn)楫?dāng)前版本的 HPCSDK 不支持 C ++并行算法中的 GPU 的虛函數(shù)調(diào)用。一般來(lái)說(shuō),出于性能原因,在 GPU 上應(yīng)該避免這種類(lèi)型的設(shè)計(jì),因?yàn)樗拗屏藞?zhí)行路徑的可預(yù)測(cè)性。

簡(jiǎn)單的解決方法是將執(zhí)行鏈?zhǔn)占絾蝹€(gè)函數(shù)中,這些函數(shù)按順序顯式調(diào)用各個(gè)組件,并用唯一的標(biāo)記標(biāo)識(shí)它們。

在 Palabos 中,這個(gè)獨(dú)特的標(biāo)記是在序列化機(jī)制的幫助下生成的,該機(jī)制最初是為了支持動(dòng)態(tài)自適應(yīng)仿真的檢查點(diǎn)和網(wǎng)絡(luò)通信而開(kāi)發(fā)的。這表明,如果重構(gòu)軟件項(xiàng)目的體系結(jié)構(gòu)足夠靈活,那么 GPU 端口的大部分重構(gòu)工作都是自動(dòng)完成的。

現(xiàn)在,您可以為每個(gè)網(wǎng)格節(jié)點(diǎn)提供一個(gè)標(biāo)記,標(biāo)識(shí)完整沖突步驟的代碼,并用一個(gè)大的 switch 語(yǔ)句表示沖突步驟:

switch(tag) { case rr_les: fun_rr_les(f_local); break; case rr_les_BCleft: fun_rr_les_BCleft(f_local); break; …

}

隨著 switch 語(yǔ)句變大,由于生成的內(nèi)核在 GPU 內(nèi)存中占用的空間,它可能會(huì)遇到性能問(wèn)題。

另一個(gè)問(wèn)題是軟件項(xiàng)目的可維護(hù)性。目前,如果不修改這個(gè) switch 語(yǔ)句(它是庫(kù)核心的一部分),就不可能提供新的碰撞模型。這兩個(gè)問(wèn)題的解決方案在于,在編譯時(shí)使用 C ++模板機(jī)制在最終用戶應(yīng)用程序中生成具有選定數(shù)量的實(shí)例的切換語(yǔ)句。 Palabos-GPU 資源頁(yè)詳細(xì)介紹了這種技術(shù)。

重新安排內(nèi)存以鼓勵(lì)合并的內(nèi)存訪問(wèn)

面向?qū)ο蟮脑O(shè)計(jì)還會(huì)導(dǎo)致內(nèi)存布局無(wú)法在 GPU 的多核架構(gòu)上高效處理。當(dāng)每個(gè)節(jié)點(diǎn)對(duì) LBM 方案的 19 個(gè)局部種群進(jìn)行分組時(shí),數(shù)據(jù)以結(jié)構(gòu)陣列( AoS )的形式結(jié)束(圖 3 )。為了簡(jiǎn)單起見(jiàn),每個(gè)節(jié)點(diǎn)只顯示四個(gè)總體。

AoS 數(shù)據(jù)布局導(dǎo)致性能不佳,因?yàn)樗柚沽肆魇教幚聿襟E中的合并內(nèi)存訪問(wèn),而流式處理步驟由于非本地模板,在內(nèi)存訪問(wèn)方面是算法最關(guān)鍵的部分。

數(shù)據(jù)應(yīng)該以陣列結(jié)構(gòu)( SoA )的方式對(duì)齊,在流式處理步驟中進(jìn)行通信的給定類(lèi)型的所有群體都在連續(xù)的內(nèi)存地址上對(duì)齊。在這種重新安排之后,即使是一個(gè)相對(duì)簡(jiǎn)單的 LBM 算法也能獲得接近典型 GPU 內(nèi)存帶寬的 80% 。

面向數(shù)據(jù)的設(shè)計(jì)意味著您將中心重要性賦予數(shù)據(jù)的結(jié)構(gòu)和布局,并圍繞此結(jié)構(gòu)構(gòu)建數(shù)據(jù)處理算法。面向?qū)ο蟮姆椒ㄍǔ2捎梅聪蚵窂健?/p>

GPU 端口的第一步應(yīng)該是了解應(yīng)用程序的理想數(shù)據(jù)布局。就 LBM 而言, GPU 上 SoA 布局的優(yōu)越性是眾所周知的事實(shí)。內(nèi)存布局和內(nèi)存遍歷算法的細(xì)節(jié)在之前發(fā)布的案例研究 開(kāi)源 STLBM 代碼 中進(jìn)行了測(cè)試。

結(jié)論

在這篇文章中,我們討論了使用 C ++標(biāo)準(zhǔn)并行編程編寫(xiě) GPU 應(yīng)用程序的基本技術(shù)。我們還提供了晶格玻爾茲曼方法和 Palabos 應(yīng)用程序的背景信息,我們?cè)诎咐芯恐惺褂昧诉@些信息。最后,我們討論了兩種方法,可以重構(gòu)源代碼,使其更適合在 GPU 上運(yùn)行。

在下一篇文章中,我們繼續(xù)使用這個(gè)應(yīng)用程序,并討論如何在NVIDIA上運(yùn)行時(shí)在C++應(yīng)用程序中獲得高性能。我們還演示了如何通過(guò)MPI擴(kuò)展應(yīng)用程序以使用多個(gè) GPU 。

關(guān)于作者

Jonas Latt 是瑞士日內(nèi)瓦大學(xué)計(jì)算機(jī)科學(xué)系的副教授。他從事高性能計(jì)算和計(jì)算流體力學(xué)的研究,并在包括地球物理、生物醫(yī)學(xué)和航空航天領(lǐng)域在內(nèi)的跨學(xué)科領(lǐng)域進(jìn)行應(yīng)用。他是 lattice Boltzmann 復(fù)雜流動(dòng)模擬開(kāi)源軟件 Palabos 的最初開(kāi)發(fā)者和當(dāng)前共同維護(hù)者。他以前在日內(nèi)瓦大學(xué)獲得物理學(xué)和計(jì)算機(jī)科學(xué)博士學(xué)位,并通過(guò)塔夫斯大學(xué)(波士頓,美國(guó))和綜合理工學(xué)校 F.E.EdRaelde 洛桑 EPFL (瑞士)的研究,并作為 CFD 公司 FuluKIT 的聯(lián)合創(chuàng)始人,對(duì)流體力學(xué)感興趣。

Christophe Guy Coreixas 是一名航空工程師, 2014 年畢業(yè)于 ISAE-SUPAERO (法國(guó)圖盧茲)。 2018 年,他在 CERFACS 從事面向行業(yè)應(yīng)用的可壓縮晶格玻爾茲曼方法研究時(shí)獲得了博士學(xué)位(流體動(dòng)力學(xué))。作為日內(nèi)瓦大學(xué)計(jì)算機(jī)科學(xué)系的博士后,克里斯多夫現(xiàn)在開(kāi)發(fā)格子玻爾茲曼模型來(lái)模擬航空、多物理和生物醫(yī)學(xué)流程。

Gonzalo Brito 是 NVIDIA 計(jì)算性能與 HPC 團(tuán)隊(duì)的高級(jí)開(kāi)發(fā)技術(shù)工程師,工作于硬件和軟件的交叉點(diǎn)。他熱衷于讓加速計(jì)算變得更容易實(shí)現(xiàn)。在加入NVIDIA 之前,岡薩洛在 RWTH 亞琛大學(xué)空氣動(dòng)力學(xué)研究所開(kāi)發(fā)了多物理方法,用于顆粒流。

Jeff Larkin 是 NVIDIA HPC 軟件團(tuán)隊(duì)的首席 HPC 應(yīng)用程序架構(gòu)師。他熱衷于高性能計(jì)算并行編程模型的發(fā)展和采用。他曾是 NVIDIA 開(kāi)發(fā)人員技術(shù)小組的成員,專(zhuān)門(mén)從事高性能計(jì)算應(yīng)用程序的性能分析和優(yōu)化。 Jeff 還是 OpenACC 技術(shù)委員會(huì)主席,曾在 OpenACC 和 OpenMP 標(biāo)準(zhǔn)機(jī)構(gòu)工作。在加入NVIDIA 之前,杰夫在位于橡樹(shù)嶺國(guó)家實(shí)驗(yàn)室的克雷超級(jí)計(jì)算卓越中心工作。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5594

    瀏覽量

    109731
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    5194

    瀏覽量

    135450
  • 計(jì)算機(jī)
    +關(guān)注

    關(guān)注

    19

    文章

    7807

    瀏覽量

    93202
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    keil實(shí)現(xiàn)cc++混合編程

    起因項(xiàng)目中使用到一個(gè)開(kāi)源的模擬IIC的庫(kù),封裝的比較好,但是是使用c++寫(xiě)的。于是將其移植到自己的項(xiàng)目中,主要有以下三步操作: 在工程選項(xiàng)中 C/C++中去掉勾選 C99 Mode
    發(fā)表于 01-26 08:58

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    C語(yǔ)言和C++到底是什么關(guān)系? 首先C++C語(yǔ)言本來(lái)就是兩種不同的編程語(yǔ)言,但C++確實(shí)是對(duì)
    發(fā)表于 12-24 07:23

    在Python中借助NVIDIA CUDA Tile簡(jiǎn)化GPU編程

    NVIDIA CUDA 13.1 版本新增了基于 Tile 的GPU 編程模式。它是自 CUDA 發(fā)明以來(lái) GPU 編程最核心的更新之一。借助 GP
    的頭像 發(fā)表于 12-13 10:12 ?1195次閱讀
    在Python中借助NVIDIA CUDA Tile簡(jiǎn)化<b class='flag-5'>GPU</b><b class='flag-5'>編程</b>

    CC++之間的聯(lián)系

    控制能力,這一點(diǎn)與C語(yǔ)言相似,使得它們?cè)谙到y(tǒng)編程、嵌入式系統(tǒng)等領(lǐng)域都得到廣泛應(yīng)用。 3、發(fā)展歷程: C++正是在C語(yǔ)言的基礎(chǔ)上逐步發(fā)展起來(lái)的,C
    發(fā)表于 12-11 06:51

    C語(yǔ)言和C++之間的區(qū)別是什么

    C++標(biāo)準(zhǔn)庫(kù)那樣集成度高和功能齊全。 6、編譯器與語(yǔ)言特性: C++編譯器通常比C語(yǔ)言編譯器更加復(fù)雜,因?yàn)樗枰幚砀嗟恼Z(yǔ)言特性,比如模板元
    發(fā)表于 12-11 06:23

    為啥 AI 計(jì)算速度這么驚人?—— 聊聊 GPU、內(nèi)存與并行計(jì)算

    提到AI,大家常說(shuō)它“算得快”,其實(shí)是指AI能在眨眼間處理海量數(shù)據(jù)??伤鼮樯队羞@本事?答案就藏在“GPU+高速內(nèi)存+并行計(jì)算”這trio(組合)里。咱們可以把AI要處理的數(shù)據(jù),想象成一大堆“小任務(wù)
    的頭像 發(fā)表于 12-05 14:35 ?854次閱讀
    為啥 AI <b class='flag-5'>計(jì)算</b>速度這么驚人?—— 聊聊 <b class='flag-5'>GPU</b>、內(nèi)存與<b class='flag-5'>并行計(jì)算</b>

    如何調(diào)試和編程CW32F030C8T7?支持哪些調(diào)試工具和編程語(yǔ)言?

    了解如何調(diào)試和編程CW32F030C8T7是開(kāi)發(fā)過(guò)程中的重要環(huán)節(jié)。它支持哪些調(diào)試工具(如JTAG、串口調(diào)試等)和編程語(yǔ)言(如C、C++等)?
    發(fā)表于 12-05 06:48

    一文了解Mojo編程語(yǔ)言

    CPU、GPU 和其他加速器的支持,簡(jiǎn)化了并行編程模型。 漸進(jìn)式類(lèi)型系統(tǒng) 結(jié)合靜態(tài)類(lèi)型檢查和類(lèi)型推導(dǎo),既保證編譯時(shí)安全性,又保留動(dòng)態(tài)類(lèi)型的靈活性。 應(yīng)用場(chǎng)景 AI 與機(jī)器學(xué)習(xí) 用于訓(xùn)
    發(fā)表于 11-07 05:59

    神經(jīng)網(wǎng)絡(luò)的并行計(jì)算加速技術(shù)

    問(wèn)題。因此,并行計(jì)算加速技術(shù)在神經(jīng)網(wǎng)絡(luò)研究和應(yīng)用中變得至關(guān)重要,它們能夠顯著提升神經(jīng)網(wǎng)絡(luò)的性能和效率,滿足實(shí)際應(yīng)用中對(duì)快速響應(yīng)和大規(guī)模數(shù)據(jù)處理的需求。神經(jīng)網(wǎng)絡(luò)并行
    的頭像 發(fā)表于 09-17 13:31 ?1126次閱讀
    神經(jīng)網(wǎng)絡(luò)的<b class='flag-5'>并行計(jì)算</b>與<b class='flag-5'>加速</b>技術(shù)

    從自然仿真到智能調(diào)度——GPU并行計(jì)算的多場(chǎng)景突破

    我們正在參加全球電子成就獎(jiǎng)的評(píng)選,歡迎大家?guī)臀覀兺镀薄x謝支持隨著復(fù)雜計(jì)算問(wèn)題的不斷涌現(xiàn),傳統(tǒng)的CPU串行計(jì)算在處理大規(guī)模數(shù)據(jù)與高并發(fā)任務(wù)時(shí)逐漸顯露瓶頸。GPU(圖形處理單元)憑借其高度
    的頭像 發(fā)表于 09-03 10:32 ?829次閱讀
    從自然仿真到智能調(diào)度——<b class='flag-5'>GPU</b><b class='flag-5'>并行計(jì)算</b>的多場(chǎng)景突破

    技能+1!如何在樹(shù)莓派上使用C++控制GPIO?

    在使用樹(shù)莓派時(shí),你會(huì)發(fā)現(xiàn)Python和Scratch是許多任務(wù)(包括GPIO編程)中最常用的編程語(yǔ)言。但你知道嗎,你也可以使用C++進(jìn)行GPIO編程,而且這樣做還有不少好處。借助Wir
    的頭像 發(fā)表于 08-06 15:33 ?4154次閱讀
    技能+1!如何在樹(shù)莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    AI芯片:加速人工智能計(jì)算的專(zhuān)用硬件引擎

    處理等應(yīng)用落地的關(guān)鍵硬件基礎(chǔ)。 ? AI芯片的核心技術(shù)特點(diǎn) ? ? AI芯片的設(shè)計(jì)重點(diǎn)在于提升計(jì)算效率,主要技術(shù)特點(diǎn)包括: ? 1. ? 并行計(jì)算架構(gòu) ?:AI任務(wù)(如矩陣乘法、卷積運(yùn)算)需要高并行性,
    的頭像 發(fā)表于 07-09 15:59 ?1576次閱讀

    邊緣AI廣泛應(yīng)用推動(dòng)并行計(jì)算崛起及創(chuàng)新GPU滲透率快速提升

    是時(shí)候重新教育整個(gè)生態(tài)了。邊緣AI的未來(lái)不屬于那些高度優(yōu)化但功能狹窄的芯片,而是屬于可編程的、可適配的并行計(jì)算平臺(tái),它們能與智能軟件共同成長(zhǎng)并擴(kuò)展。
    的頭像 發(fā)表于 06-11 14:57 ?678次閱讀

    讀懂極易并行計(jì)算:定義、挑戰(zhàn)與解決方案

    GPU經(jīng)常與人工智能同時(shí)提及,其中一個(gè)重要原因在于AI與3D圖形處理本質(zhì)上屬于同一類(lèi)問(wèn)題——它們都適用極易并行計(jì)算。什么是極易并行計(jì)算?極易并行計(jì)算指的是符合以下特征的
    的頭像 發(fā)表于 04-17 09:11 ?819次閱讀
    讀懂極易<b class='flag-5'>并行計(jì)算</b>:定義、挑戰(zhàn)與解決方案

    C++學(xué)到什么程度可以找工作?

    C++開(kāi)發(fā)的工作不僅需要深厚的編程功底,還要具備解決實(shí)際問(wèn)題的能力,以及良好的溝通能力和團(tuán)隊(duì)協(xié)作精神。此外,持續(xù)學(xué)習(xí)和更新自己的知識(shí)體系也是保持競(jìng)爭(zhēng)力的關(guān)鍵。
    發(fā)表于 03-13 10:19