CUDA系列一 基本概念

2021-09-22 08:28:21 字數 2753 閱讀 1231

太久沒有寫部落格了,最近一直在整cuda c這塊的東西,學了一陣子了但是水平還是一般般。作為乙個半入門的人,寫點記錄一來是可以幫助自己記憶,更多的是希望可以幫助他人,做技術這塊寫點東西能夠幫助到他人,我想這大概是自己最開心的事情,以後盡量多寫些有用的東西吧。

1. 基本概念

常用的操作主要包括函式宣告,變數宣告,記憶體型別宣告,紋理記憶體,原子操作等。

(1)乙個執行緒塊包含多個執行緒;

(2)每個block之間是並行執行的,block之間無法通訊,因而無執行順序可言;

(3)執行緒塊的數量限制為不超過65536;

由多個執行緒塊組成

在cuda架構中,執行緒束是指乙個包含32個執行緒的集合,這個執行緒集合被編織在一起且執行步調一致。

(1)在gpu上具體執行操作過程往往是通過核函式來實現的。

(2)一般通過識別符號__global__修飾,通過<<>>呼叫,用於說明核函式中的執行緒數和執行緒塊的組織分布情況。

(3)以執行緒格的形式組織,每個執行緒格由若干個執行緒塊組成,而且每個執行緒塊又由若干個執行緒組成。

(4)以block為單元執行。

(5)能在主機端進行呼叫。

(6)呼叫時必須宣告核心函式的執行引數。

(7)在程式設計時,必須先為kernel函式中用到的陣列或者變數分配好足夠的裝置端空間,再呼叫kernel函式,否則gpu計算時會發生錯誤。

(8)函式修飾符:

__global__,表明被修飾的函式在裝置上執行,但在主機上呼叫。

__device__,表明被修飾的函式在裝置上執行,但智慧型在其他__device__函式或者__global__函式中呼叫,即裝置函式上呼叫。

2.常用的gpu記憶體函式

(1)函式原型:cudaerror_t cudamalloc(void **devptr, size_t size)

(2)函式用處:用於裝置端變數分配視訊記憶體

(3)注意:

cudamalloc()分配的指標傳遞在裝置上執行的函式

可以在裝置**中使用cudamalloc()分配的指標進行裝置記憶體讀寫操作

可以將cudamalloc()分配的指標傳遞給主機上執行的函式

不可以在主機**中使用cudamalloc()分配的指標進行主機記憶體的讀寫操作

(1)函式原型:cudaerror_t cudamemcpy(void *dst,const void *src,size_t count,cudamemcpykind kind)

(2)函式作用:與c語言中的memcpy函式一樣,該函式可以在主機記憶體和gpu記憶體之間互相拷貝資料

(1)函式原型:cudaerror_t cudafree(void *devptr)

(2)函式作用:該函式釋放的時cudamalloc分配的記憶體

3.gpu記憶體分類

通俗意義上的裝置記憶體

(1)位置:裝置記憶體

(2)形式:關鍵字__shared__新增到變數宣告中,如__shared__ int arr[10]。

(3)目的:對於gpu上啟動的每個執行緒塊,cuda c編譯器都將建立該共享變數的乙個副本。執行緒塊中的每個執行緒都共享這塊記憶體,但執行緒卻無法看到也不能修改其他執行緒塊的變數副本。這樣使得乙個執行緒塊中的多個執行緒中的多個執行緒能夠在計算上通訊和協作。

(1)位置:裝置記憶體

(2)形式:關鍵字__constant__新增到變數宣告中。如__constant__ int arr[10];

(3)目的:為了提公升效能。常量記憶體採取了不同於標準全域性記憶體的處理方式。在某些情況下,用常量記憶體替換全域性記憶體能有效地減少記憶體頻寬。

(4)常量記憶體用於儲存在該核函式執行期間不會發生變化的資料。變數的訪問限制為唯讀。nvidia硬體提供了64kb的常量記憶體。不再需要cudamalloc()或者cudafree(),而是在編譯時,靜態地分配空間。

(5)要求:當需要拷貝資料到常量記憶體中應該使用cudamemcpytosymbol(),而cudamemcpy()會幅值到全域性記憶體。

(1)位置:裝置記憶體

(2)目的:能夠減少對記憶體的請求並提供有效的記憶體頻寬。專門為哪些記憶體訪問模式中存在大量空間區域性性的圖形應用程式設計,意味著乙個執行緒讀取的位置可能與鄰近執行緒讀取的位置非常接近。

(3)紋理記憶體必須宣告為檔案作用域內的全域性變數

(4)形式:

一維紋理記憶體:texturetexin

通過cudabindtexture()繫結到紋理記憶體中的資料

通過tex1dfetch()來讀取紋理記憶體中的資料

通過cudaunbindtexture()取消繫結紋理記憶體

二維紋理記憶體:texture《型別,數字》

通過cudabindtexture2d()繫結到紋理記憶體中

通過tex2d()來讀取紋理記憶體中的資料

通過cudaunbingtexture()取消繫結紋理記憶體

(1)如果操作的執行過程不能分解為更小的部分,則將滿足這種條件限制的操作稱為原子操作

同步方法__syncthreads(),這個函式的呼叫,將確保執行緒塊中的每個執行緒都執行完。

其實這些基本概念也是參考網上其他人寫的,結合個人理解覺得寫的還不錯的,所以重新寫了一遍,水平有限,如有不當之處,請指明,謝謝!

二 cuda學習筆記之 cuda基本概念

cuda c是對c c 語言進行拓展後形成的變種,相容c c 語法,檔案型別為.cu檔案,編譯器使用的是nvcc。相比傳統的c c 主要新增了一下幾個方面 1.一維結構 首先從簡單的一維結構來確認執行緒索引。如下圖所示 grid在x,y,z方向上都有block,block在x,y,z三個方向都有th...

CUDA學習筆記 一些基本概念

學習cuda程式設計過程中的一些筆記,記錄一些學習的情況吧。一般情況是記錄學習過程中自己的理解,而不是準確的公認的定義或公式,即在 學習筆記 中,我只記錄我理解並消化了的東西,那些我沒有理解的想作為今後學習的內容大概會放在其他記錄中。學習筆記中的內容有時候有可能不是那麼準確,不過隨著學習的深入我的理...

rabbitmq系列 一 基本概念理解

rabbitmq是乙個由erlang開發的amqp advanced message queue protocol 的開源實現。amqp高階訊息佇列,說白了就是乙個開源的訊息中介軟體。它能解決不同元件 模組 系統間訊息通訊。rabbitmq server 也叫broker server,儲存訊息的地...