日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

提升CUDA程序运行效率的几个关键点

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 提升CUDA程序运行效率的几个关键点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1、明確計算機中GPU卡片的計算資源,決定變量的性質(constant,share還是global)以及Grid,Block的維度,充分并合理利用GPU顯卡的資源

2、提高PCI接口與GPU顯卡的數據吞吐量

3、優化GPU內部存儲到處理器之間的數據傳輸效率

4、利用性能分析工具進行程序性能分析,根據建議進行程序的性能優化


最近由于項目需要,需要用MPI+CUDA混合編程提高程序運行效率。相對于MPI并行程序編程,要想充分利用CUDA的資源利用率,還是要考慮很多方面的內容,根據查找的一些相關資料,將提升GPU顯卡吞吐率以及利用效率的方法歸納如下,如有問題,敬請批評指正。下面是進行CUDA編程的大致流程,為了避免混亂,會將相關的詳細內容放到鏈接所示的位置。

1、明確計算機中GPU卡片的計算資源,決定變量的性質(constant,share還是global)以及Grid,Block的維度,充分并合理利用GPU顯卡的資源

在進行程序編寫前需要明確知道計算機資源,尤其是顯卡資源是很寶貴的,在實際編程中需要進行綜合考慮,然后再進行參數的具體設置。首先得明白顯卡的基本的一些信息,可以通過安裝NVIDIA_SAMPLES來進行顯卡基本信息的獲取,NVIDIA_CUDA-9.1_Samples/1_Utilities/deviceQuery,我的機器的GPU顯卡的具體信息如下:

這里面的每一條信息都是很重要的,其中我們平時用的最多的還是“Total amount of global memory,Multiprocessors,? CUDA Cores/MP,L2 Cache Size,Maximum Texture Dimension Size (x,y,z),Total amount of constant memory,Total amount of shared memory per block,Total number of registers available per block,Warp size,Maximum number of threads per multiprocessor,Maximum number of threads per block,Max dimension size of a thread block (x,y,z),Max dimension size of a grid size ? ?(x,y,z),Integrated GPU sharing Host Memory,Support host page-locked memory mapping,Device has ECC support”等等,在地球物理相關的CUDA程序編寫中,關注這些參數就已經足夠了。對于一個程序在運行時對顯卡資源的分配問題,詳細內容可以點擊下面兩個鏈接。

具體可參考:GPU硬件結構和程序具體參數設置_yu132563的專欄-CSDN博客

CUDA程序編寫具體參數設置_yu132563的專欄-CSDN博客

2、提高PCI接口與GPU顯卡的數據吞吐量

  • 使用流并行及統一內存、zerocopy等方法掩蓋PCI接口與GPU顯卡之間進行數據傳輸的時間延遲
  • 核函數執行和數據傳輸的重疊

3、優化GPU內部存儲到處理器之間的數據傳輸效率

主要方法如下:

  • 使用共享內存減少全局內存讀取次數
  • 減少全局內存的重復數據的重復訪問,此處大有學問,需要設計我們的線程組織模式,最大可能利用共享內存,可參考矩陣乘法優化問題;
  • 把全局內存綁定為紋理
  • 紋理的存取速度要遠高于全局內存

  • 減少bank conflict, 讓不同線程讀取連續內存
  • Tesla 的每個 SM 擁有 16KB 共享存儲器,用于同一個線程塊內的線程間通信。為了使一個 half-warp 內的線程能夠在一個內核周期中并行訪問,共享存儲器被組織成 16 個 bank,每個 bank 擁有 32bit 的寬度,故每個 bank 可保存 256 個整形或單精度浮點數,或者說目前的 bank 組織成了 256 行 16 列的矩陣。如果一個 half-warp 中有一部分線程訪問屬于同一bank 的數據,則會產生 bank conflict,降低訪存效率,在沖突最嚴重的情況下,速度會比全局顯存還慢,但是如果 half-warp 的線程訪問同一地址的時候,會產生一次廣播,其速度反而沒有下降。在不發生 bank conflict 時,訪問共享存儲器的速度與寄存器相同。在不同的塊之間,共享存儲器是毫不相關的。
  • 尺寸和對齊的要求內存對齊
  • 因為GPU 上的內存控制器,從某個固定的倍數地址開始讀取,才會有最高的效率(例如 16 bytes 的倍數)。分配內存時使用cudaMallocPitch替代cudaMalloc,相應 cudaMemcpy2D替代 cudaMemcpy。(這其實和(2)中原理類似)

  • 合并訪問
  • 詳情可參考:CUDA總結:合并訪問coalesced_Kelvin_Yan的專欄-CSDN博客_cuda合并訪問
  • 使用流并行
  • 流并行屬于,任務級別的并行,當我們有幾個互不相關的任務時,可以寫多個核函數,資源允許的情況下,我們將這些核函數裝載到不同流上,然后執行,這樣可以實現更粗粒度的并行。
    實驗中發現,流并行的效率和增加一個線程網格的維度的方法的效率一樣。也可以使用沒線程默認流來進行流并行

4、利用性能分析工具進行程序性能分析,根據建議進行程序的性能優化

nvvp和nvprof工具進行性能分析,進一步提高計算性能

參考文獻:

CUDA中Bank conflict沖突_smsmn的專欄-CSDN博客

CUDA總結:合并訪問coalesced_Kelvin_Yan的專欄-CSDN博客_cuda合并訪問

CUDA程序優化方法_changyi9995的博客-CSDN博客_cuda優化

CUDA2.2-原理之存儲器訪問 - 仙守 - 博客園

CUDA編程——zero copy_道道道人間道的博客-CSDN博客_cuda zerocopy

cuda Global Memory Access - 灰太狼鍋鍋 - 博客園

CUDA學習--CUDA流_Yi_M的博客-CSDN博客_cuda 流

CUDA編程第六章: 流和并發_Janus-CSDN博客

CUDA 7 Stream流簡化并發性 - 吳建明wujianming - 博客園

總結

以上是生活随笔為你收集整理的提升CUDA程序运行效率的几个关键点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。