女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

通過NVIDIA GPU內存預取實現應用程序性能的提高

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-02 16:33 ? 次閱讀

NVIDIA GPU 具有強大的計算能力,通常必須以高速傳輸數據才能部署這種能力。原則上這是可能的,因為 GPU 也有很高的內存帶寬,但有時他們需要你的幫助來飽和帶寬。

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

上下文

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

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

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

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

預取

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

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

要確定此技術是否能幫助您的程序更快地運行,請使用 GPU 評測工具(如 NVIDIA Nsight Compute )檢查以下內容:

確認沒有使用所有內存帶寬。

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

確認這些暫停集中在迭代互不依賴的大型循環中。

展開

考慮這種循環的最簡單可能的優化,稱為展開。如果循環足夠短,可以告訴編譯器完全展開循環,并顯式展開迭代。由于迭代是獨立的,編譯器可以提前發出所有數據請求(“加載”),前提是它為每個加載分配不同的寄存器

這些請求可以相互重疊,因此整個負載集只經歷一個內存延遲,而不是所有單個延遲的總和。更妙的是,加載指令本身的連續性隱藏了單個延遲的一部分。這是一種接近最優的情況,但可能需要大量寄存器才能接收加載結果。

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

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

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

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

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

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

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

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

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

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

將預取值存儲在共享內存中更容易,因為您可以使用數組表示法,無需任何努力就可以改變預取距離。然而,共享內存并不像寄存器那樣接近執行單元。當數據準備好使用時,它需要一條額外的指令將數據從那里移動到寄存器中。為了方便起見,我們引入宏vsmem來簡化共享內存中數組的索引

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

除了批量預取,還可以進行“滾動”預取。在這種情況下,在進入主循環之前填充預取緩沖區,然后在每次循環迭代期間從內存中預取一個值,以便在以后的PDIST迭代中使用。下一個示例使用數組表示法和共享內存實現滾動預取。

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

與批處理方法相反,滾動預取在主循環執行期間不會再出現足夠大的預取距離的內存延遲。它還使用相同數量的共享內存或寄存器資源,因此它似乎是首選。然而,一個微妙的問題可能會限制其有效性。

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

以下是相應的代碼:

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

由于每一條__pipeline_wait_prior指令都必須與一條__pipeline_commit指令匹配,我們在進入主計算循環之前,將后者放入預取緩沖區的循環中,以簡化匹配指令對的簿記。

績效結果

圖 1 顯示,對于不同的預取距離,在前面描述的五種算法變化下,從金融應用程序中獲取的內核的性能改進。

分批預取到寄存器(標量分批)

分批預取到共享內存( smem 分批)

將預取滾動到寄存器(標量滾動)

將預取滾動到共享內存( smem 滾動)

使用異步內存拷貝將預取滾動到共享內存( smem 滾動異步)

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 。不同預取策略的內核加速

顯然,將預取滾動到具有異步內存拷貝的共享內存中會帶來很好的好處,但隨著預取緩沖區大小的增加,這是不均勻的。

使用 Nsight Compute 對結果進行更仔細的檢查后發現,共享內存中會發生內存組沖突,這會導致異步負載的扭曲被拆分為比嚴格必要的更連續的內存請求。經典的優化方法是在共享內存中填充數組大小,以避免錯誤的跨步,這種方法在這種情況下有效。PADDING的值的選擇應確保PDIST和PADDING之和等于二加一的冪。將其應用于所有使用共享內存的變體:

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

這導致圖 2 所示的共享內存結果得到改善。預取距離僅為 6 ,再加上以滾動方式進行的異步內存拷貝,就足以以比原始版本代碼近 60% 的加速比獲得最佳性能。實際上,我們可以通過更改共享內存中數組的索引方案來實現這種性能改進,而無需使用填充,這是留給讀者的練習。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 。使用共享內存填充的不同預取策略的內核加速

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

總結

在本文中,我們向您展示了源代碼的本地化更改示例,這些更改可能會加快內存訪問。這些不會改變從內存移動到 SMs 的數據量,只會改變時間。通過重新安排內存訪問,使數據在到達 SM 后被多次重用,您可以進行更多優化。

關于作者

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

Fred Oh 是 CUDA 、 CUDA on WSL 和 CUDA Python 的高級產品營銷經理。弗雷德擁有加州大學戴維斯分校計算機科學和數學學士學位。他的職業生涯開始于一名 UNIX 軟件工程師,負責將內核服務和設備驅動程序移植到 x86 體系結構。他喜歡《星球大戰》、《星際迷航》和 NBA 勇士隊。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 存儲器
    +關注

    關注

    38

    文章

    7633

    瀏覽量

    166390
  • NVIDIA
    +關注

    關注

    14

    文章

    5238

    瀏覽量

    105760
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4909

    瀏覽量

    130648
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    NVIDIA火熱招聘GPU性能計算架構師

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

    GPU加速XenApp/Windows 2016/Office/IE性能提高

    7.14 -NVIDIA vGPU Manager(384.73) - 適用于OS的NVIDIA驅動程序(385.41)我也對在XenApp中測試/驗證GPU使用/
    發表于 09-12 16:24

    探求NVIDIA GPU極限性能的利器

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

    Cortex-R82的器功能分析

    性能處理器采用硬件數據取來減少大的主內存延遲對性能的負面影響。有效的機制可以顯著
    發表于 08-09 06:11

    快速識別應用程序性能瓶頸

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

    PIC32MX系列參考手冊之高速緩存模塊

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

    利用矢量硬件如何提高應用程序性能

    本次會議演示了識別和修改代碼以利用矢量硬件的過程如何提高應用程序性能
    的頭像 發表于 05-31 11:46 ?1489次閱讀

    近600個應用程序通過NVIDIA GPU實現了提速

    十幾年前,還不曾有加速應用程序。而如今已有近600個應用程序通過NVIDIA GPU實現了提速。
    的頭像 發表于 02-14 14:15 ?5171次閱讀

    LabVIEW應用程序性能瓶頸的解決

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

    使用NVIDIA TensorRT部署實時深度學習應用程序

    深度神經網絡 (DNN) 是實現強大的計算機視覺和人工智能應用程序的強大方法。今天發布的NVIDIA Jetpack 2.3使用 NVIDIA TensorRT (以前稱為
    的頭像 發表于 04-18 14:28 ?2459次閱讀
    使用<b class='flag-5'>NVIDIA</b> TensorRT部署實時深度學習<b class='flag-5'>應用程序</b>

    如何使用NVIDIA Docker部署GPU服務器應用程序

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

    通過GPU內存訪問調整提高應用程序性能

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

    通過32Gb/S光纖通道提高應用程序性能

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

    使用Brocade Gen 7 SAN確保應用程序性能和可靠性

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

    PGO到底是什么?PGO如何提高應用程序性能呢?

    PGO到底是什么?PGO如何提高應用程序性能呢? PGO,全稱為Profile Guided Optimization,譯為“基于特征優化”的技術,是一種通過利用應用程序的運行特征數據
    的頭像 發表于 10-26 17:37 ?2386次閱讀