Cuda學習筆記(三) Cuda程式設計Tips

2021-07-11 02:56:43 字數 1432 閱讀 6717

cuda中對核心函式的呼叫<<< m , n >>>,m表示執行緒塊的個數,n表示每個執行緒塊的執行緒數, m個執行緒塊構成乙個執行緒格。m和n可以是一維的或者二維(三維)的,即使n是一維的,那麼m也可以是二維的。

共享記憶體對於每個執行緒塊建立乙個副本,但是共享記憶體對於所有的執行緒塊中的執行緒都是相同的。

執行緒同步語句-syncthreads()在cuda的架構中,cuda會確保所有的執行緒都執行完同步才會繼續往下執行,因此當執行緒發散,有些執行緒同步而有些不同步時那麼gpu程式會一直掛起直到程式崩潰。

cudamemcpy()是直接把cpu的記憶體傳輸到gpu上,成為全域性記憶體。而cudamemcpytosymbol則是把cpu資料直接拷貝到gpu上,成為常量記憶體。常量記憶體當直接使用變數名而不是陣列時,底層的彙編**可以看到,其速度往往更快,因為直接使用變數名不再需要根據陣列的首位址在進行偏移得到資料,而是可以直接在編譯的過程中根據變數名將其轉換為數字字面值。所以,在較新的2.0計算能力的顯示卡上,全域性記憶體借助一級快取也能達到和常量記憶體使用陣列進行運算的速度。

使用常量記憶體的乙個判斷訣竅: 對資料的計算不需要依賴threadidx等。

利用cudaeventrecord來記錄的gpu執行時間,在起始和結束之間只能留有gpu**,而不能是gpu和cpu的混合**,否則會發生錯誤。

紋理記憶體對於具有空間結構性的記憶體讀取具有較大的幫助,比如影象求取四鄰域等,可以直接利用一維的紋理函式進行讀取。此外乙個比較有用的就是利用紋理進行低解析度的線性插值。當使用二維紋理讀取記憶體時,當讀取環繞周圍的畫素,即使是邊界畫素或邊界外畫素也可以自動更改為邊界處的資料,而使用一維的紋理記憶體則需要自己編寫**做邊界和邊界外的處理。二者不同之處在於紋理記憶體的宣告和繫結這兩處,在最終的釋放資源解繫結則是相同的。

當使用原子操作時,最好多考慮最大利用共享記憶體,一方面可以減少原子操作概率形成序列讀取全域性記憶體而導致的延遲,另一方面也能充分利用共享記憶體的高速傳輸速率。

gpu的多執行緒指的是大量資料執行同乙個相同的任務,而cuda中的流則是指明任務並行性,即同時執行不同的任務。

鎖頁記憶體可以減少gpu讀取主機記憶體的傳輸時間,保證dma直接訪問的最大速度,但是所有的記憶體分配如果都使用鎖頁記憶體的話將使主機很快耗盡記憶體。一般情況下,對源資料記憶體和目標記憶體分配鎖頁記憶體。

cuda中對流的編寫應該採用寬度優先的方式,而非深度優先的方式,即記憶體複製操作輪訓一遍所有的流,然後再核函式一遍所有的流。因為cuda對流的排程總是要等當前流的上一次操作執行完後才能繼續,這樣寬度交叉執行就能避免同乙個流上形成的序列執行。流的記憶體分配應該用鎖頁記憶體,記憶體複製應該用cudamemcpyasync而不是cudamemcpy。

零拷貝記憶體具有和鎖頁記憶體一樣的特點,即是固定的不可移走的記憶體。此外,他還是直接分配在裝置上的記憶體,不需要從主機拷貝到裝置,可以在主機上宣告分配,並直接被裝置訪問,因此成為零拷貝記憶體。

nsight可以單點除錯vs的程式中的核函式部分,而生成的exe可以通過visual profiler視覺化分析各部分效能。

CUDA程式設計學習(三)

乙個kernel所啟動的所有執行緒稱為乙個網格 grid 同乙個網格上的執行緒共享相同的全域性記憶體空間,grid是執行緒結構的第一層次。網格又可以分成很多執行緒塊 block 乙個執行緒塊裡包含很多執行緒,這是第二個層次。wrap 32個執行緒一組,這是第三個層次。kernel在呼叫時必須通過執行...

CUDA學習筆記二 程式設計模型

首先要了解什麼是異構架構計算 即gpu和cpu協同工作,cpu端稱為主機端用host表示,gpu端稱為裝置端用device表示。gpu和cpu連線一般協議是pci e,最新的協議有nvme,延遲更小。程式執行流程主要分為六個大的部分 在host端分配記憶體,進行資料初始化。在device端分配記憶體...

CUDA程式設計

cuda目前支援linux和windows作業系統。進行cuda開發需要依次安裝驅動 toolkit sdk三個軟體。在 安裝目錄 c src目錄下有很多的例程可以進行學習。cuda 的核心有三個重要抽象概念 執行緒組層次結構 共享儲存器 遮蔽同步 barrier synchronization 可...