在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

微基準測試的性能特征及如何在應用程序中使用統一內存

星星科技指導員 ? 來源:NVIDIA ? 作者:Chirayu Garg ? 2022-04-18 17:40 ? 次閱讀

自7多年前推出至今, CUDA 統一內存編程模型一直在開發(fā)人員中廣受歡迎。統一內存為 GPU 應用程序的原型設計提供了一個簡單的接口,而無需在主機和設備之間手動 MIG 評級內存。

從 NVIDIA Pascal 更容易擴展到更大的問題規(guī)模體系結構開始,支持統一內存的應用程序可以使用系統 CPU 中所有可用的 CPU 和 GPU 內存。有關使用統一內存開始 GPU 計算的更多信息,請參閱 CUDA 更簡單的介紹。

您是否希望使用大型數據集無縫運行應用程序,同時保持內存管理簡單?統一內存可用于使虛擬內存分配大于可用 GPU 內存。在發(fā)生超額訂閱時, GPU 自動開始將內存頁逐出到系統內存,以便為活動的在用虛擬內存地址騰出空間。

但是,應用程序性能在很大程度上取決于內存訪問模式、數據駐留和運行的系統。在過去幾年中,我們發(fā)表了幾篇關于使用統一內存實現 GPU 內存超額訂閱的文章。我們通過各種編程技術(如預取和內存使用提示)為您的應用程序實現更高的性能提供了幫助。

在這篇文章中,我們深入研究了一個微基準測試的性能特征,它強調了超額訂閱場景中不同的內存訪問模式。它可以幫助您分解并了解統一內存的所有性能方面:什么時候適合,什么時候不適合,以及您可以做些什么。正如您將從我們的結果中看到的,根據平臺、超額訂閱因素和內存提示,性能可能會變化 100 倍。我們希望這篇文章能讓您更清楚地知道何時以及如何在應用程序中使用統一內存!

基準設置和訪問模式

要評估統一內存超額訂閱性能,可以使用分配和讀取內存的簡單程序。使用cudaMallocManaged分配一大塊連續(xù)內存,然后在 GPU 上訪問該內存,并測量有效的內核內存帶寬。不同的統一內存性能提示,如cudaMemPrefetchAsync和cudaMemAdvise修改分配的統一內存。我們將在本文后面討論它們對性能的影響。

我們定義了一個名為“ oversubscription factor ”的參數,它控制分配給測試的可用 GPU 內存的分數。

值為 1.0 表示 GPU 上的所有可用內存都已分配。

小于 1.0 的值表示 GPU 未被超額認購

大于 1.0 的值可以解釋為給定 GPU 的超額認購量。例如,具有 32 GB 內存的 GPU 的超額訂閱因子值為 1.5 意味著使用統一內存分配了 48 GB 內存。

我們在微基準測試中測試了三種內存訪問內核:網格步長、塊邊和隨機每扭曲。網格跨步和塊跨步是許多 CUDA 應用程序中最常見的順序訪問模式。然而,非結構化或隨機訪問在新興的 CUDA 工作負載中也非常流行,如圖形應用程序、哈希表和推薦系統中的嵌入。我們決定測試這三個。

網格步長

每個線程塊在循環(huán)迭代中訪問相鄰內存區(qū)域中的元素,然后進行網格跨步(blockDim.x * gridDim.x)。

圖 1 網格訪問模式

template
 __global__ void read_thread(data_type *ptr, const size_t size)
 {
     size_t n = size / sizeof(data_type);
     data_type accum = 0;
  
     for(size_t tid = threadIdx.x + blockIdx.x * blockDim.x; tid < n; tid += blockDim.x * gridDim.x)
         accum += ptr[tid];
  
     if (threadIdx.x == 0)
       ptr[0] = accum;
 } 

擋步

每個線程塊訪問一大塊連續(xù)內存,這是根據分配的總內存大小確定的。在任何給定的時間, SM 上的駐留塊都可以訪問不同的內存頁,因為分配給每個塊的內存域很大。

圖 2 塊跨步訪問模式

template
 __global__ void read_thread_blockCont(data_type *ptr, const size_t size)
 {
   size_t n = size / sizeof(data_type);
   data_type accum = 0;
  
   size_t elements_per_block = ((n + (gridDim.x - 1)) / gridDim.x) + 1;
   size_t startIdx = elements_per_block * blockIdx.x;
  
   for (size_t rid = threadIdx.x; rid < elements_per_block; rid += blockDim.x) {
     if ((rid + startIdx) < n)
       accum += ptr[rid + startIdx];
   }
  
   if (threadIdx.x == 0)
     ptr[0] = accum;
 } 

隨機翹曲

在此訪問模式中,對于 warp 的每個循環(huán)迭代,選擇一個隨機頁面,然后訪問一個連續(xù)的 128B ( 4B 的 32 個元素)區(qū)域。這將導致線程塊的每個扭曲跨所有線程塊訪問隨機頁面。扭曲的循環(huán)計數由扭曲的總數和分配的總內存決定。

圖 3 隨機扭曲訪問模式,扭曲的每個循環(huán)迭代選擇一個隨機頁面并訪問頁面中的隨機 128B 區(qū)域

內核使用線程塊和網格參數啟動,以實現 100% 的占用率。內核的所有塊始終駐留在 GPU 上。

硬件設置

本文中的基準測試使用了以下三種不同硬件設置中的一種 GPU 。

我們研究了不同的內存駐留技術,以提高這些訪問模式的超額訂閱性能。從根本上說,我們試圖消除統一內存頁錯誤,并找到最佳的數據分區(qū)策略,以獲得基準測試的最佳讀取帶寬。在本文中,我們將討論以下內存模式:

按需 MIG 定額

Zero-copy

CPU 和 GPU 之間的數據分區(qū)

在下面的部分中,我們將深入到性能分析和所有優(yōu)化的解釋中。我們還討論了哪些工作負載能夠與統一內存一起很好地解決超額訂閱問題。

基線實施:按需 MIG 定額

在此測試用例中,使用cudaMallocManaged執(zhí)行內存分配,然后按照以下方式在系統( CPU )內存上填充頁面:

cudaMallocManaged(&uvm_alloc_ptr, allocation_size);
 // all the pages are initialized on CPU
  
 for (int i = 0; i < num_elements; i++)
     uvm_alloc_ptr[i] = 0.0f;

然后,執(zhí)行 GPU 內核,并測量內核的性能:

read_thread<<>>((float*)uvm_alloc_ptr, allocation_size);

我們使用了上一節(jié)中描述的三種訪問模式之一。這是使用統一內存進行超額訂閱的最簡單方法,因為程序員不需要提示。

在內核調用時, GPU 嘗試訪問駐留在主機上的虛擬內存地址。這會觸發(fā)一個頁面錯誤事件,導致通過 CPU – GPU 互連將內存頁面 MIG 分配到 GPU 內存。內核性能受生成的頁面錯誤模式和 CPU – GPU 互連速度的影響。

頁面錯誤模式是動態(tài)的,因為它取決于流式多處理器上塊和扭曲的調度。然后是 GPU 線程發(fā)出的內存加載指令。

圖 4 grid stride ` read _ thread `內核執(zhí)行的 NVIDIA NSight 系統時間線視圖。內存行上顯示的 HtoD 和 DtoH 傳輸是由于 MIG 定量和從 GPU 從頁面錯誤中逐出造成的。

圖 5 顯示了如何在空 GPU 和超額訂閱 GPU 上處理頁面錯誤。在超額訂閱時,首先將內存頁從 GPU 內存移出到系統內存,然后將請求的內存從 CPU 轉移到 GPU 。

圖 5 頁面錯誤服務和數據逐出機制。

圖 6 顯示了使用 Power9 CPU 在 V100 、 A100 和 V100 上通過不同訪問模式獲得的內存帶寬。

圖 6 基線內存分配的讀取帶寬

順序存取分析

訪問模式和不同平臺之間頁面故障驅動的內存讀取帶寬的差異可以通過以下因素來解釋:

訪問模式的影響:傳統上,已知網格跨步訪問模式在訪問 GPU 駐留內存時可實現最大內存帶寬。這里,由于該模式生成的頁面錯誤通信量,塊跨步訪問模式實現了更高的內存帶寬。還值得注意的是, Power9 CPU 上的默認系統內存頁大小為 64 KB ,而 x86 系統上為 4 KB 。這有助于在觸發(fā)頁面錯誤事件時,統一內存錯誤 MIG 將較大的內存塊從 CPU 移動到 GPU 。

對 GPU 體系結構和互連的敏感性: DGX A100 在 CPU 和 GPU 之間具有更快的 PCIe Gen4 互連。這可能是 A100 實現更高帶寬的原因。然而,互連帶寬并不是飽和的。更高帶寬的主要因素是 A100 GPU 和 108 個流式多處理器可以產生更多的頁面錯誤,因為 GPU 上有更多的活動線程塊。 P9 測試也證實了這一理解,盡管 GPU – CPU 之間的 NVLink 連接理論峰值帶寬為 75 GB / s ,但讀取帶寬低于 A100 。

Tip:在這篇文章的實驗中,我們發(fā)現流式網格和塊跨步內核訪問模式對線程塊大小和塊內同步不敏感。但是,為了使用討論的其他優(yōu)化方法獲得更好的性能,我們在一個塊中使用了 128 個線程,在每個循環(huán)展開時進行塊內同步。這確保了塊的所有扭曲有效地使用 SM 的地址轉換單元。要了解塊內同步的內核設計,請參閱本文發(fā)布的源代碼。嘗試使用不同塊大小的同步和不同步變體。

隨機存取分析

在 x86 平臺的超額訂閱域中,由于許多頁面錯誤以及由此產生的從 GPU 到 GPU 的內存 MIG 比率,隨機扭曲訪問模式僅產生幾百 KB / s 的讀取帶寬。由于訪問是隨機的,因此使用了 MIG 額定內存的一小部分。額定為 MIG 的內存可能最終被逐出回 CPU ,以便為其他內存片段騰出空間。

但是,在 Power9 系統上啟用了訪問計數器,從而從 GPU 進行 CPU 映射內存訪問,并且并非所有訪問的內存片段都立即被 MIG 評級為 GPU 。這導致了一致的內存讀取帶寬,與 x86 系統相比,內存抖動更少。

優(yōu)化 1 :直接訪問系統內存(零拷貝)

除了通過互連將內存頁從系統內存移動到 GPU 內存之外,您還可以直接從 GPU 訪問固定系統內存。這種內存分配方法也稱為零拷貝內存。

可使用 CUDA API 調用cudaMallocHost或通過將虛擬地址范圍的首選位置設置為 CPU ,從統一內存接口分配固定系統內存。

cudaMemAdvise(uvm_alloc_ptr, allocation_size, cudaMemAdviseSetPreferredLocation, cudaCpuDeviceId);

cudaMemAdvise(uvm_alloc_ptr, allocation_size, cudaMemAdviseSetAccessedBy, current_gpu_device);

圖 7 grid stride ` read _ thread `內核直接訪問固定系統內存的 NVIDIA NSight 系統時間線視圖。沒有任何頁面錯誤事件或任何方向的內存?zhèn)鬏敗?/p>

圖 8 零拷貝內存的數據訪問路徑

圖 9 顯示了讀內核實現的內存帶寬。在 x86 平臺上, A100 GPU 可以實現比 V100 更高的帶寬,因為 DGX A100 上 CPU 和 GPU 之間的 PCIe Gen4 互連速度更快。類似地, Power9 系統通過網格跨步訪問模式實現接近互連帶寬的峰值帶寬。 A100 GPU 上的網格跨步帶寬模式會隨著過度訂閱而降低,因為 GPU MMU 地址轉換未命中會增加加載指令的延遲。

圖 9 零拷貝內存的內存讀取帶寬

對于所有測試的系統,隨機扭曲訪問在超額訂閱域中產生 3-4 GB / s 的恒定帶寬。這比前面介紹的故障驅動場景要好得多。

收獲

從數據中可以清楚地看出,零拷貝方法實現了比基線更高的帶寬。當您希望避免從 CPU 和 GPU 取消映射和映射內存時,固定系統內存是有利的。如果應用程序只使用分配的數據一次,那么使用零拷貝內存直接訪問更好。但是,如果應用程序中存在數據重用,則根據訪問模式和重用情況,對 GPU 的錯誤和 MIG 評級數據可以產生更高的聚合帶寬。

優(yōu)化 2 :在 CPU – GPU 之間進行數據分區(qū)的直接內存訪問

對于前面解釋的故障驅動 MIG 比率, GPU MMU 系統在 GPU 上達到所需的內存范圍之前會出現額外的暫停開銷。為了克服這一開銷,您可以在 CPU 和 GPU 之間分配內存,并將內存從 GPU 映射到 CPU ,以便于無故障內存訪問。

在 CPU 和 GPU 之間分配內存有幾種方法:

為內存分配設置了SetAccessedBy統一內存提示的cudaMemPrefetchAsync API 調用。

CPU 和 GPU 之間的手動混合內存分配,帶有手動預取和使用SetPreferredLocation和SetAccessedBy提示。

我們發(fā)現,這兩種方法在許多訪問模式和體系結構組合中表現相似,只有少數例外。在本節(jié)中,我們主要討論手動頁面分發(fā)。您可以在unified-memory-oversubscription GitHub repo 中查找這兩者的代碼。

圖 10 分配到 GPU 和 CPU 內存的頁的內存訪問路徑

在混合內存分發(fā)中,很少有內存頁可以固定到 CPU ,并使用cudaMemAdvise API 調用將setAccessedBy提示設置為 GPU 設備顯式映射內存。在我們的測試用例中,我們以循環(huán)方式將多余的內存頁映射到 CPU ,其中到 CPU 的映射取決于 GPU 的超額訂閱量。例如,在超額訂閱因子值為 1 。 5 時,每三個頁面映射到 CPU 。超額認購系數為 2 。 0 時,每隔一頁將映射到 CPU 。

在我們的實驗中,內存頁設置為 2MB ,這是 GPU MMU 可以操作的最大頁大小。

圖 11 分布在 CPU 和 GPU 的 2MB 頁面。 Y 軸使用對數刻度。

對于小于 1 。 0 的超額訂閱值,所有內存頁都駐留在 GPU 上。與超額認購率大于 1 。 0 的情況相比,您可以看到更高的帶寬。對于大于 1 。 0 的超額訂閱值,基本 HBM 內存帶寬和 CPU – GPU 互連速度等因素控制最終內存讀取帶寬。

Tip:在 Power9 系統上進行測試時,我們遇到了顯式大容量內存預取的有趣行為(選項 a )。因為在 P9 系統上啟用了訪問計數器,所以移出的內存并不總是固定在 GPU 上,統一內存驅動程序可以啟動從 CPU 到 GPU 的數據 MIG 分配。這將導致從 GPU 逐出,并且該循環(huán)將在內核的整個生命周期內持續(xù)。這個過程會對流塊和網格步長內核產生負面影響,并且它們比手動頁面分發(fā)獲得的帶寬更低。

解決方案:單一 GPU 超額認購

在使用統一內存的 GPU 超額訂閱的三種不同內存分配策略中,給定應用程序分配方法的最佳選擇取決于內存訪問模式和 GPU 內存的重用。

當您在故障和固定系統內存分配之間進行選擇時,后者在所有平臺和 GPU 上的性能始終更好。如果內存子區(qū)域的 GPU 駐留從總體應用程序速度中受益,那么 GPU 和 CPU 之間的內存頁分配是一種更好的分配策略。

嘗試統一內存優(yōu)化

在這篇文章中,我們回顧了一個具有一些常見訪問模式的基準測試,并分析了從 x86 到 P9 ,以及 V100 和 A100 GPU s 的各種平臺上的性能。您可以使用這些數據作為參考來進行預測,并考慮在代碼中使用統一內存是否有益。我們還介紹了多種數據分布模式和統一內存模式,它們有時會帶來顯著的性能優(yōu)勢。有關更多信息,請參閱 GitHub 上的unified-memory-oversubscription微基準源代碼。

在上一篇文章中,我們證明了基于統一內存的超額訂閱對大數據分析和大深度學習模型特別有效。請嘗試在代碼中使用統一內存進行超額訂閱,并讓我們知道它如何幫助您提高應用程序性能。

關于作者

Chirayu Garg 是 NVIDIA 的高級人工智能開發(fā)技術工程師。他致力于加速 GPU 上的深度學習和機器學習應用程序。此前,他為 NVIDIA 的游戲流媒體服務開發(fā)了視頻和圖像處理算法

審核編輯:郭婷

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

    關注

    14

    文章

    5049

    瀏覽量

    103354
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4760

    瀏覽量

    129131
收藏 人收藏

    評論

    相關推薦

    何在ModusToolbox?中檢查和設置應用程序內存地址?

    何在ModusToolbox?中檢查和設置應用程序內存地址?
    發(fā)表于 03-01 10:16

    何在PC上測試固件應用程序

    困難:在USB控制中心應用中,壓入傳輸數據為大容量輸入或輸出導致錯誤代碼997。批量輸出傳輸批量傳輸失敗,錯誤代碼:997傳輸中的散裝散裝散裝錯誤代碼:997這個錯誤是什么?我如何克服它?你是如何在PC上測試固件應用程序的?謝謝
    發(fā)表于 10-11 06:13

    何在我的應用程序中使用DMA?

    。試圖找出如何在我的應用程序中使用DMA,我發(fā)現SPI驅動程序已經調用DMA函數。因此,為了在我的應用程序
    發(fā)表于 10-29 09:14

    何在linux應用程序中使用pwm捕獲?

    /402e4000.pwm/pwm/pwmchip6/pwm0# cat capture cat: capture: 函數未實現 那么,如何在 linux 應用程序中使用 pwm 捕獲?
    發(fā)表于 05-10 07:05

    何在C程序中使用匯編

    怎樣在C程序中使用匯編,如何在C程序中使用匯編:方法:在每個匯編語句前加asm即可。如:voi
    發(fā)表于 09-23 23:43 ?55次下載

    網絡開發(fā)者套件(NDK)通信性能基準測試

    此文檔僅限于通信性能,不包括特定的測試。服務器和自定義應用程序。通過隔離NDK,這里描述的基準,允許更多對客戶應用軟件進行準確的性能測量。
    發(fā)表于 04-18 16:34 ?5次下載
    網絡開發(fā)者套件(NDK)通信<b class='flag-5'>性能</b>的<b class='flag-5'>基準</b><b class='flag-5'>測試</b>

    如何使用DPDK進行網絡性能基準測試

    描述英特爾如何使用DPDK第3層轉發(fā)(l3fwd)示例應用程序工作負載執(zhí)行高吞吐量網絡性能基準測試
    的頭像 發(fā)表于 10-31 06:57 ?6001次閱讀

    何在谷歌云上使用Hyperledger Caliper測試區(qū)塊鏈應用程序

    本文提供了有關如何在谷歌云上使用Hyperledger Caliper(提交302665)的指南,介紹了測試Hyperledger Composer應用程序的場景,Hyperledger
    發(fā)表于 08-28 11:19 ?1282次閱讀

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

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

    使用CUDA流順序內存分配器助于提高現有應用程序性能

      為了衡量新的流式有序分配器在實際應用程序中的性能影響,以下是來自 RAPIDS GPU 大數據基準 ( GPU -bdb]的結果。
    的頭像 發(fā)表于 04-21 15:32 ?4378次閱讀
    使用CUDA流順序<b class='flag-5'>內存</b>分配器助于提高現有<b class='flag-5'>應用程序</b>的<b class='flag-5'>性能</b>

    何在ADAS應用程序中使用MIPI?CSI-2端口復制記錄傳感器數據

    何在ADAS應用程序中使用MIPI?CSI-2端口復制記錄傳感器數據
    發(fā)表于 11-02 08:16 ?1次下載
    如<b class='flag-5'>何在</b>ADAS<b class='flag-5'>應用程序</b><b class='flag-5'>中使</b>用MIPI?CSI-2端口復制記錄傳感器數據

    何在深度學習結構中使用紋理特征

    來源:AI公園,作者:TraptiKalra編譯:ronghuaiyang導讀這是前篇文章的繼續(xù),在這篇文章中,我們將討論紋理分析在圖像分類中的重要性,以及如何在深度學習中使用紋理分析。在這
    的頭像 發(fā)表于 10-10 09:15 ?1079次閱讀
    如<b class='flag-5'>何在</b>深度學習結構<b class='flag-5'>中使</b>用紋理<b class='flag-5'>特征</b>

    .NET應用程序性能測試

    WebLOAD通過輕松的測試腳本創(chuàng)建和基于深度服務器端分析的性能測試.NET應用程序提供了全面的解決方案。
    的頭像 發(fā)表于 08-29 09:40 ?545次閱讀

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

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

    何在測試中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大會 上分享了他如何在測試中使用 ChatGPT。
    的頭像 發(fā)表于 02-20 13:57 ?780次閱讀
    主站蜘蛛池模板: 热99re久久精品2久久久| 国产午夜亚洲精品| 综合天天色| 97玖玖| 午夜视频在线| 日日干视频| 国产人人爱| 网站在线观看视频| 91免费视| 狠狠色噜噜狠狠狠狠97老肥女| 国语自产免费精品视频一区二区| 中文字幕婷婷| 网络色综合久久| 欧美一区二区三区在线观看| 毛片在线看免费版| 国产精品亚洲玖玖玖在线靠爱| 一区中文字幕| 影音先锋午夜资源网站| 久久99热精品这里久久精品| 亚洲一卡二卡在线| 色天使色护士 在线视频观看| 欧美成人精品久久精品| 韩毛片| 天天做天天摸天天爽天天爱| 久久福利国产| 亚洲小说区图片区另类春色| 在线五月婷婷| 欧美一级做一a做片性视频| 国产美女精品在线| 天天草狠狠干| 欧美三级黄| 在线亚洲欧美性天天影院| 日韩a级毛片| 俺去啦最新官网| 美女被草视频在线观看| 一区免费视频| 四虎最新紧急入口4hu| 加勒比色| 丝袜美女被| 中文字幕亚洲一区二区v@在线 | 国产一区二区三区不卡观|