一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

通過NVIDIA GPU內(nèi)存預(yù)取實(shí)現(xiàn)應(yīng)用程序性能的提高

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

掃碼添加小助手

加入工程師交流群

NVIDIA GPU 具有強(qiáng)大的計(jì)算能力,通常必須以高速傳輸數(shù)據(jù)才能部署這種能力。原則上這是可能的,因?yàn)?GPU 也有很高的內(nèi)存帶寬,但有時(shí)他們需要你的幫助來飽和帶寬。

在本文中,我們將研究一種實(shí)現(xiàn)這一點(diǎn)的特定方法:預(yù)取。我們將解釋在什么情況下預(yù)取可以很好地工作,以及如何找出這些情況是否適用于您的工作負(fù)載。

上下文

NVIDIA GPU 從大規(guī)模并行中獲得力量。 32 個(gè)線程的許多扭曲可以放置在流式多處理器( SM )上,等待輪到它們執(zhí)行。當(dāng)一個(gè) warp 因任何原因暫停時(shí), warp 調(diào)度程序會(huì)以零開銷切換到另一個(gè),確保 SM 始終有工作要做。

在高性能的 NVIDIA Ampere 架構(gòu) A100 GPU 上,多達(dá) 64 個(gè)活動(dòng)翹板可以共享一個(gè) SM ,每個(gè)都有自己的資源。除此之外, A100 還有 108 條短信,可以同時(shí)執(zhí)行 warp 指令。

大多數(shù)指令都必須對(duì)數(shù)據(jù)進(jìn)行操作,而這些數(shù)據(jù)幾乎總是源于連接到 GPU 的設(shè)備內(nèi)存( DRAM )。 SM 上大量的翹曲都可能無法工作的一個(gè)主要原因是,它們正在等待來自內(nèi)存的數(shù)據(jù)。

如果出現(xiàn)這種情況,并且內(nèi)存帶寬沒有得到充分利用,則可以重新組織程序,以改善內(nèi)存訪問并減少扭曲暫停,從而使程序更快地完成。這叫做延遲隱藏。

預(yù)取

CPU 上的硬件通常支持的一種技術(shù)稱為預(yù)取。 CPU 看到來自內(nèi)存的請(qǐng)求流到達(dá),找出模式,并在實(shí)際需要數(shù)據(jù)之前開始獲取數(shù)據(jù)。當(dāng)數(shù)據(jù)傳輸?shù)?CPU 的執(zhí)行單元時(shí),可以執(zhí)行其他指令,有效地隱藏傳輸成本(內(nèi)存延遲)。

預(yù)取是一種有用的技術(shù),但就芯片上的硅面積而言很昂貴。相對(duì)而言, GPU 的這些成本甚至更高,因?yàn)?GPU 的執(zhí)行單元比 CPU 多得多。相反, GPU 使用多余的扭曲來隱藏內(nèi)存延遲。當(dāng)這還不夠時(shí),可以在軟件中使用預(yù)取。它遵循與硬件支持的預(yù)取相同的原理,但需要明確的指令來獲取數(shù)據(jù)。

要確定此技術(shù)是否能幫助您的程序更快地運(yùn)行,請(qǐng)使用 GPU 評(píng)測工具(如 NVIDIA Nsight Compute )檢查以下內(nèi)容:

確認(rèn)沒有使用所有內(nèi)存帶寬。

確認(rèn)翹曲被阻止的主要原因是 攤位長記分牌 ,這意味著 SMs 正在等待來自 DRAM 的數(shù)據(jù)。

確認(rèn)這些暫停集中在迭代互不依賴的大型循環(huán)中。

展開

考慮這種循環(huán)的最簡單可能的優(yōu)化,稱為展開。如果循環(huán)足夠短,可以告訴編譯器完全展開循環(huán),并顯式展開迭代。由于迭代是獨(dú)立的,編譯器可以提前發(fā)出所有數(shù)據(jù)請(qǐng)求(“加載”),前提是它為每個(gè)加載分配不同的寄存器。

這些請(qǐng)求可以相互重疊,因此整個(gè)負(fù)載集只經(jīng)歷一個(gè)內(nèi)存延遲,而不是所有單個(gè)延遲的總和。更妙的是,加載指令本身的連續(xù)性隱藏了單個(gè)延遲的一部分。這是一種接近最優(yōu)的情況,但可能需要大量寄存器才能接收加載結(jié)果。

如果循環(huán)太長,可能會(huì)部分展開。在這種情況下,成批的迭代會(huì)被擴(kuò)展,然后您會(huì)遵循與之前相同的一般策略。你的工作很少(但你可能沒那么幸運(yùn))。

如果循環(huán)包含許多其他指令,這些指令的操作數(shù)需要存儲(chǔ)在寄存器中,那么即使只是部分展開也可能不是一個(gè)選項(xiàng)。在這種情況下,在您確認(rèn)滿足之前的條件后,您必須根據(jù)進(jìn)一步的信息做出一些決定。

預(yù)取意味著使數(shù)據(jù)更接近 SMs 的執(zhí)行單元。寄存器是最接近的。如果有足夠的可用空間(可以使用 Nsight Compute Occupation 視圖找到),可以直接預(yù)取到寄存器中。

考慮下面的循環(huán),其中數(shù)組arr被存儲(chǔ)在全局存儲(chǔ)器( DRAM )中。它隱式地假設(shè)只使用了一個(gè)一維線程塊,而對(duì)于從中派生的激勵(lì)應(yīng)用程序來說,情況并非如此。然而,它減少了代碼混亂,并且不會(huì)改變參數(shù)。

在本文的所有代碼示例中,大寫變量都是編譯時(shí)常量。BLOCKDIMX假定預(yù)定義變量blockDim.x的值。出于某些目的,它必須是編譯時(shí)已知的常數(shù),而出于其他目的,它有助于避免在運(yùn)行時(shí)進(jìn)行計(jì)算。

for (i=threadIdx.x; i
};>

假設(shè)您有八個(gè)寄存器用于預(yù)取。這是一個(gè)調(diào)整參數(shù)。下面的代碼在每四次迭代開始時(shí)獲取四個(gè)雙精度值,占據(jù)八個(gè) 4 字節(jié)寄存器,并逐個(gè)使用它們,直到批耗盡,此時(shí)您將獲取一個(gè)新批。

為了跟蹤批處理,引入一個(gè)計(jì)數(shù)器(ctr),該計(jì)數(shù)器隨著線程執(zhí)行的每個(gè)后續(xù)迭代而遞增。為了方便起見,假設(shè)每個(gè)線程的迭代次數(shù)可以被 4 整除。

double v0, v1, v2, v3;
for (i=threadIdx.x, ctr=0; i
};>

通常,預(yù)取的值越多,該方法就越有效。雖然前面的例子并不復(fù)雜,但有點(diǎn)麻煩。如果預(yù)取值(PDIST或預(yù)取距離)的數(shù)量發(fā)生變化,則必須添加或刪除代碼行。

將預(yù)取值存儲(chǔ)在共享內(nèi)存中更容易,因?yàn)槟梢允褂脭?shù)組表示法,無需任何努力就可以改變預(yù)取距離。然而,共享內(nèi)存并不像寄存器那樣接近執(zhí)行單元。當(dāng)數(shù)據(jù)準(zhǔn)備好使用時(shí),它需要一條額外的指令將數(shù)據(jù)從那里移動(dòng)到寄存器中。為了方便起見,我們引入宏vsmem來簡化共享內(nèi)存中數(shù)組的索引

#define vsmem(index) v[index+PDIST*threadIdx.x]
__shared__ double v[PDIST* BLOCKDIMX];
for (i=threadIdx.x, ctr=0; i
};>

除了批量預(yù)取,還可以進(jìn)行“滾動(dòng)”預(yù)取。在這種情況下,在進(jìn)入主循環(huán)之前填充預(yù)取緩沖區(qū),然后在每次循環(huán)迭代期間從內(nèi)存中預(yù)取一個(gè)值,以便在以后的PDIST迭代中使用。下一個(gè)示例使用數(shù)組表示法和共享內(nèi)存實(shí)現(xiàn)滾動(dòng)預(yù)取。

__shared__ double v[PDIST* BLOCKDIMX];
for (k=0; k
};>

與批處理方法相反,滾動(dòng)預(yù)取在主循環(huán)執(zhí)行期間不會(huì)再出現(xiàn)足夠大的預(yù)取距離的內(nèi)存延遲。它還使用相同數(shù)量的共享內(nèi)存或寄存器資源,因此它似乎是首選。然而,一個(gè)微妙的問題可能會(huì)限制其有效性。

循環(huán)中的同步(例如,syncthreads)構(gòu)成了一個(gè)內(nèi)存圍欄,并迫使arr的加載在同一迭代中的該點(diǎn)完成,而不是在以后的 PDIST 迭代中完成。解決方法是使用異步加載到共享內(nèi)存中,最簡單的版本在 CUDA 程序員指南的 Pipeline interface 部分中解釋。這些異步加載不需要在同步點(diǎn)完成,只需要在顯式等待時(shí)完成。

以下是相應(yīng)的代碼:

#include 
__shared__ double v[PDIST* BLOCKDIMX];
for (k=0; k
};>

由于每一條__pipeline_wait_prior指令都必須與一條__pipeline_commit指令匹配,我們?cè)谶M(jìn)入主計(jì)算循環(huán)之前,將后者放入預(yù)取緩沖區(qū)的循環(huán)中,以簡化匹配指令對(duì)的簿記。

績效結(jié)果

圖 1 顯示,對(duì)于不同的預(yù)取距離,在前面描述的五種算法變化下,從金融應(yīng)用程序中獲取的內(nèi)核的性能改進(jìn)。

分批預(yù)取到寄存器(標(biāo)量分批)

分批預(yù)取到共享內(nèi)存( smem 分批)

將預(yù)取滾動(dòng)到寄存器(標(biāo)量滾動(dòng))

將預(yù)取滾動(dòng)到共享內(nèi)存( smem 滾動(dòng))

使用異步內(nèi)存拷貝將預(yù)取滾動(dòng)到共享內(nèi)存( smem 滾動(dòng)異步)

Graph shows that smem rolling async speeds up by -60% at a distance of 6.Graph shows that smem rolling async speeds up by -60% at a distance of 6.

圖 1 。不同預(yù)取策略的內(nèi)核加速

顯然,將預(yù)取滾動(dòng)到具有異步內(nèi)存拷貝的共享內(nèi)存中會(huì)帶來很好的好處,但隨著預(yù)取緩沖區(qū)大小的增加,這是不均勻的。

使用 Nsight Compute 對(duì)結(jié)果進(jìn)行更仔細(xì)的檢查后發(fā)現(xiàn),共享內(nèi)存中會(huì)發(fā)生內(nèi)存組沖突,這會(huì)導(dǎo)致異步負(fù)載的扭曲被拆分為比嚴(yán)格必要的更連續(xù)的內(nèi)存請(qǐng)求。經(jīng)典的優(yōu)化方法是在共享內(nèi)存中填充數(shù)組大小,以避免錯(cuò)誤的跨步,這種方法在這種情況下有效。PADDING的值的選擇應(yīng)確保PDIST和PADDING之和等于二加一的冪。將其應(yīng)用于所有使用共享內(nèi)存的變體:

#define vsmem(index) v[index+(PDIST+PADDING)*threadIdx.x]

這導(dǎo)致圖 2 所示的共享內(nèi)存結(jié)果得到改善。預(yù)取距離僅為 6 ,再加上以滾動(dòng)方式進(jìn)行的異步內(nèi)存拷貝,就足以以比原始版本代碼近 60% 的加速比獲得最佳性能。實(shí)際上,我們可以通過更改共享內(nèi)存中數(shù)組的索引方案來實(shí)現(xiàn)這種性能改進(jìn),而無需使用填充,這是留給讀者的練習(xí)。Graph shows speedup percentages where scalar rolling alone slows performance by ~60% and other rolling/batched strategies shows speedups of 20-30%.Graph shows speedup percentages where scalar rolling alone slows performance by ~60% and other rolling/batched strategies shows speedups of 20-30%.

圖 2 。使用共享內(nèi)存填充的不同預(yù)取策略的內(nèi)核加速

一個(gè)尚未討論的 預(yù)取的變化 將數(shù)據(jù)從全局內(nèi)存移動(dòng)到二級(jí)緩存,如果共享內(nèi)存中的空間太小,無法容納所有符合預(yù)取條件的數(shù)據(jù),這可能很有用。這種類型的預(yù)取在 CUDA 中無法直接訪問,需要在較低的 PTX 級(jí)別進(jìn)行編程。

總結(jié)

在本文中,我們向您展示了源代碼的本地化更改示例,這些更改可能會(huì)加快內(nèi)存訪問。這些不會(huì)改變從內(nèi)存移動(dòng)到 SMs 的數(shù)據(jù)量,只會(huì)改變時(shí)間。通過重新安排內(nèi)存訪問,使數(shù)據(jù)在到達(dá) SM 后被多次重用,您可以進(jìn)行更多優(yōu)化。

關(guān)于作者

Rob Van der Wijngaart 是 NVIDIA 的高級(jí)高性能計(jì)算( HPC )架構(gòu)師。他在各種工業(yè)和政府實(shí)驗(yàn)室從事 HPC 領(lǐng)域的研究超過三十年,是廣泛使用的 NAS 并行基準(zhǔn)測試的共同開發(fā)者。Ren é Peters 是 NVIDIA 的產(chǎn)品經(jīng)理,他在增強(qiáng)/虛擬現(xiàn)實(shí)和人工智能的交叉點(diǎn)指導(dǎo)產(chǎn)品開發(fā)。在科技行業(yè)任職期間,他還與物聯(lián)網(wǎng)IoT )和云計(jì)算等技術(shù)合作。邁爾斯·麥克林( Miles Macklin )是NVIDIA 的首席工程師,致力于模擬技術(shù)。他從哥本哈根大學(xué)獲得計(jì)算機(jī)科學(xué)博士學(xué)位,從事計(jì)算機(jī)圖形學(xué)、基于物理學(xué)的動(dòng)畫和機(jī)器人學(xué)的研究。他在 ACM SIGGRAPH 期刊上發(fā)表了幾篇論文,他的研究已經(jīng)被整合到許多商業(yè)產(chǎn)品中,包括NVIDIA 的 PhysX 和 ISAAC 健身房模擬器。他最近的工作旨在為 GPU 上的可微編程開發(fā)健壯高效的框架。

Fred Oh 是 CUDA 、 CUDA on WSL 和 CUDA Python 的高級(jí)產(chǎn)品營銷經(jīng)理。弗雷德?lián)碛屑又荽髮W(xué)戴維斯分校計(jì)算機(jī)科學(xué)和數(shù)學(xué)學(xué)士學(xué)位。他的職業(yè)生涯開始于一名 UNIX 軟件工程師,負(fù)責(zé)將內(nèi)核服務(wù)和設(shè)備驅(qū)動(dòng)程序移植到 x86 體系結(jié)構(gòu)。他喜歡《星球大戰(zhàn)》、《星際迷航》和 NBA 勇士隊(duì)。

審核編輯:郭婷

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

    關(guān)注

    38

    文章

    7653

    瀏覽量

    167435
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5309

    瀏覽量

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

    關(guān)注

    28

    文章

    4948

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    NVIDIA火熱招聘GPU性能計(jì)算架構(gòu)師

    這邊是NVIDIA HR Allen, 我們目前在上海招聘GPU性能計(jì)算架構(gòu)師(功能驗(yàn)證)的崗位,有意向的朋友歡迎發(fā)送簡歷到 allelin@nvidia
    發(fā)表于 09-01 17:22

    GPU加速XenApp/Windows 2016/Office/IE性能會(huì)提高

    7.14 -NVIDIA vGPU Manager(384.73) - 適用于OS的NVIDIA驅(qū)動(dòng)程序(385.41)我也對(duì)在XenApp中測試/驗(yàn)證GPU使用/
    發(fā)表于 09-12 16:24

    探求NVIDIA GPU極限性能的利器

    1、探求 NVIDIA GPU 極限性能的利器  在通常的 CUDA 編程中,用戶主要通過 CUDA C/C++ 或 python 語言實(shí)現(xiàn)
    發(fā)表于 10-11 14:35

    Cortex-R82的預(yù)器功能分析

    性能處理器采用硬件數(shù)據(jù)預(yù)取來減少大的主內(nèi)存延遲對(duì)性能的負(fù)面影響。有效的預(yù)機(jī)制可以顯著
    發(fā)表于 08-09 06:11

    快速識(shí)別應(yīng)用程序性能瓶頸

    RATIONAL QUANTIFY FOR WINDOWS能查明應(yīng)用程序性能瓶頸,從而確保使用JAVA、VISUAL C/C++和VISUAL BASIC開發(fā)的應(yīng)用程序的質(zhì)量和性能。
    發(fā)表于 04-18 22:15 ?20次下載

    PIC32MX系列參考手冊(cè)之預(yù)高速緩存模塊

    本節(jié)介紹 PIC32MX 器件系列中的預(yù)高速緩存模塊的功能和工作方式。預(yù)高速緩存功能可以 提高大多數(shù)
    發(fā)表于 06-22 05:20 ?2次下載
    PIC32MX系列參考手冊(cè)之<b class='flag-5'>預(yù)</b><b class='flag-5'>取</b>高速緩存模塊

    利用矢量硬件如何提高應(yīng)用程序性能

    本次會(huì)議演示了識(shí)別和修改代碼以利用矢量硬件的過程如何提高應(yīng)用程序性能。
    的頭像 發(fā)表于 05-31 11:46 ?1581次閱讀

    近600個(gè)應(yīng)用程序通過NVIDIA GPU實(shí)現(xiàn)了提速

    十幾年前,還不曾有加速應(yīng)用程序。而如今已有近600個(gè)應(yīng)用程序通過NVIDIA GPU實(shí)現(xiàn)了提速。
    的頭像 發(fā)表于 02-14 14:15 ?5335次閱讀

    LabVIEW應(yīng)用程序性能瓶頸的解決

    了解如何識(shí)別和解決LabVIEW應(yīng)用程序中的性能瓶頸。使用內(nèi)置工具和VI分析器,您可以監(jiān)視VIs的內(nèi)存使用情況和執(zhí)行時(shí)間,以確定導(dǎo)致應(yīng)用程序性能下降的代碼部分。
    發(fā)表于 03-29 14:03 ?8次下載
    LabVIEW<b class='flag-5'>應(yīng)用程序</b>中<b class='flag-5'>性能</b>瓶頸的解決

    使用NVIDIA TensorRT部署實(shí)時(shí)深度學(xué)習(xí)應(yīng)用程序

    深度神經(jīng)網(wǎng)絡(luò) (DNN) 是實(shí)現(xiàn)強(qiáng)大的計(jì)算機(jī)視覺和人工智能應(yīng)用程序的強(qiáng)大方法。今天發(fā)布的NVIDIA Jetpack 2.3使用 NVIDIA TensorRT (以前稱為
    的頭像 發(fā)表于 04-18 14:28 ?2547次閱讀
    使用<b class='flag-5'>NVIDIA</b> TensorRT部署實(shí)時(shí)深度學(xué)習(xí)<b class='flag-5'>應(yīng)用程序</b>

    如何使用NVIDIA Docker部署GPU服務(wù)器應(yīng)用程序

    管理工作流程的方式。使用 Docker ,我們可以在工作站上開發(fā)和原型化 GPU 應(yīng)用程序,然后在任何支持 GPU 容器的地方發(fā)布和運(yùn)行這些應(yīng)用程序。
    的頭像 發(fā)表于 04-27 15:06 ?3093次閱讀
    如何使用<b class='flag-5'>NVIDIA</b> Docker部署<b class='flag-5'>GPU</b>服務(wù)器<b class='flag-5'>應(yīng)用程序</b>

    通過GPU內(nèi)存訪問調(diào)整提高應(yīng)用程序性能

    在本文的所有代碼示例中,大寫變量都是編譯時(shí)常量。 BLOCKDIMX 采用預(yù)定義變量 blockDim 的值。 x 、 出于某些目的,它必須是編譯時(shí)已知的常量,而出于其他目的,它有助于避免在運(yùn)行時(shí)進(jìn)行計(jì)算。
    的頭像 發(fā)表于 08-15 16:24 ?1852次閱讀

    通過32Gb/S光纖通道提高應(yīng)用程序性能

    電子發(fā)燒友網(wǎng)站提供《通過32Gb/S光纖通道提高應(yīng)用程序性能.pdf》資料免費(fèi)下載
    發(fā)表于 07-29 09:56 ?0次下載
    <b class='flag-5'>通過</b>32Gb/S光纖通道<b class='flag-5'>提高</b><b class='flag-5'>應(yīng)用程序性能</b>

    使用Brocade Gen 7 SAN確保應(yīng)用程序性能和可靠性

    電子發(fā)燒友網(wǎng)站提供《使用Brocade Gen 7 SAN確保應(yīng)用程序性能和可靠性.pdf》資料免費(fèi)下載
    發(fā)表于 09-01 10:51 ?0次下載
    使用Brocade Gen 7 SAN確保<b class='flag-5'>應(yīng)用程序性能</b>和可靠性

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢?

    PGO到底是什么?PGO如何提高應(yīng)用程序性能呢? PGO,全稱為Profile Guided Optimization,譯為“基于特征優(yōu)化”的技術(shù),是一種通過利用應(yīng)用程序的運(yùn)行特征數(shù)據(jù)
    的頭像 發(fā)表于 10-26 17:37 ?2483次閱讀