CUDA學習筆記 一些基本概念

2021-06-28 12:17:25 字數 2779 閱讀 7103

學習cuda程式設計過程中的一些筆記,記錄一些學習的情況吧。一般情況是記錄學習過程中自己的理解,而不是準確的公認的定義或公式,即在「學習筆記」中,我只記錄我理解並消化了的東西,那些我沒有理解的想作為今後學習的內容大概會放在其他記錄中。學習筆記中的內容有時候有可能不是那麼準確,不過隨著學習的深入我的理解應該會越來越深刻吧。提前在這裡進行說明,之後就不在文中進行具體解釋了。

這篇文章主要是一些cuda的基本概念,牽扯到的具體內容不過多敘述。

【什麼是cuda】

現在一說到gpu程式設計,許多人想到的就是cuda,網上搜尋也能搜到一大堆cuda相關的資訊。它是英偉達(nvidia)

出品的一種gpu。

gpu跟cpu相比有乙個很明顯的優勢,那就是gpu並行運算能力超強,對於處理大量資料的運算有很大幫助。運算速度大概能比cpu快好幾倍吧。而cuda和其他gpu相比,有乙個特點是cuda支援c語言程式設計,這對接下來的學習很有幫助。不過由於gpu和cpu之間的資訊傳遞需要時間,所以個人認為如果不是加速十分明顯的情況在cpu上計算為好。

【host】

主機。cpu端。

【device】

裝置。gpu端。

【thread】

執行緒。有個說法是乙個core對應乙個thread。不過我的理解是,thread是cuda工作的乙個最小單位。thread有一維、二維、三維之說。

【block】

。乙個block由若干個thread組成。block有一維、二維、三維之說。

【grid】

。乙個grid由若干個block組成。

【warp】

執行緒束。這是乙個很形象的說法。加入把thread比作條,那麼warp就是一把thread一起。warp中的thread數是32(32個thread為一組),同乙個warp中的thread會以不同的資料,執行同樣的指令。

【sp】sp即(streaming processor),是最基本的處理單元。

【sm】sm是(streaming multiprocessor),由個sp附加一些其他單元組成的。

關於sp、sm、thread、block等的關係參考的部落格cuda 的threading:block 和grid 的設定與warp。

【kernel】

核函式。device上執行的函式。程式設計時,必須先為kernel中的陣列或變數分配好空間。host呼叫時,採用kernel_fun<<>>(param lists)這樣的形式。其中,dg是定義grid的維度和尺寸,db是定義block的維度和尺寸,ns是每個block除了靜態分配的shared memory以外,最多動態分配shared memory的大小(單位byte),s是cudastream_t型別,表示核

函式處在哪個流中,param lists是引數列表。dg和db都是dim3型別。

【dim3】基於unit3定義的向量型別。unit3有三個資料成員:unsigned int x,unsigned int y,unsigned int z

【內建變數】

threadidx:獲取執行緒id,如果是一維threaad那麼threadidx.x,二維threadidx.y,三維threadidx.z。blockidx

,同樣有blockidx.x,blockidx.y,blockidx.z。blockdim,block的維度,即對應thread的長度,有blockdim.x,blockdim.y,blockdim.z。griddim,grid的維度,有griddim.x,griddim.y,griddim.z。

【儲存型別】暫存器:核函式內定義。__global__:全域性記憶體,在主機函式中開闢和釋放。__shared__:共享儲存,每個block內共享這個儲存。__constant__:常量儲存,唯讀,定義在函式之外,作用域整個檔案。__texture__:紋理儲存,唯讀,記憶體不連續(暫時不是很了解)。

【函式修飾符】修飾函式的。__global__:kernel從host呼叫。__device__:kernel從device呼叫(可以被__global__修飾的函式呼叫,也可以被__device__修飾的函式呼叫)。__host__:主機函式,供主機函式呼叫。

【記憶體函式】常用的有三個。cudaerror_t cudamalloc(void **devptr, size_t size),在device上分配記憶體。cudaerror_t cudafree(void **devptr),釋放device的記憶體,與cudamalloc對應。cudaerror_t cudamemcpy(void **dst, const void *src, size_t count, cudamemcpykind kind),拷貝儲存資料,可以把host的資料拷貝到device上,也可以把device上的資料拷貝到host上。

【原子性】如果執行操作的步驟不能再分解為更小的步驟,那麼這樣的操作被稱為原子操作。呼叫函式形如atomic***()。

---------------

cuda的概念之類還有很多,目前我學習並有一定理解的大概就以上這些,先把它們記下來。

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

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

Python學習筆記 1 一些基本概念

一 字典,列表,序列字典 關鍵字 值的形式儲存,無序用形式 列表 值有序儲存,索引從0開始 用 value0,value1 形式列表索引可以為負 1表示最後乙個元素 分片索引列表構成乙個新的列表 li a b c d e 則 li 0,3 為 a b c 從0 到3 但不包含 li 3 li 1,1...

libtorch學習筆記(3) 一些基本概念

看名稱scaler就知道它是乙個數字,在libtorch中可以把標量視為零階張量,可以如此宣告 標量 auto scaler torch tensor 1.0f std cout scaler sizes length scaler.sizes size n scaler std endl 向量就是...