cuda程式設計模型是乙個異構模型,需要cpu和gpu協同工作。
在cuda中,host和device是兩個重要的概念,我們用host
指代cpu及其記憶體,而用device
指代gpu及其記憶體。
cuda程式中既包含host程式, 又包含device程式,他們分別在cpu和gpu上執行,同時, host與device之間可以進行通訊,這樣他們之間可以進行資料拷貝。
深刻理解kernel
gpu上有很多並行化的輕量級執行緒。kernel在device上執行時實際上是啟動很多執行緒,乙個kernel所啟動的所有執行緒稱為乙個網格(grid),同乙個網格上的執行緒共享相同的全域性記憶體空間,grid是執行緒結構的第一層次。
網格可以分為很多執行緒塊(block),乙個執行緒塊裡面包含很多執行緒,這是第二個層次。
dim3可以看成是包含三個無符號整數(x,y,z)成員的結構體變數,在定義時,預設值初始化為1; 對於圖中結構(主要水平方向為x軸)。
定義的grid和block示例如下圖所示,kernel在呼叫時也必須通過執行配置<<>>來指定kernel所使用的執行緒數及結構。
所以,乙個執行緒需要兩個內建的座標變數**(blockidx,threadidx)**來唯一標識,它們都是dim3型別變數
,其中blockidx
指明執行緒所在grid中的位置
,而threaidx
指明執行緒所在block中的位置
。
對於乙個2-dim的block(dx, dy), 執行緒(x, y)的id值為:(x+y*dx);
對於乙個3-dim的block(dx, dy, dz), 執行緒(x, y, z)的id值為:(x+ydx+ zdx*dy);
cuda程式設計示例1
kernel的這種執行緒組織結構天然適合vector,matrix等運算,如我們將利用上圖2-dim結構實現兩個矩陣的加法,每個執行緒負責處理每個位置的兩個元素相加,**如下所示。執行緒塊大小為(16, 16),然後將n*n大小的矩陣均分為不同的執行緒塊來執行加法運算。
// kernel定義
__global__ void
matadd
(float a[n]
[n],
float b[n]
[n],
float c[n]
[n])
intmain()
python基礎學習第一天
python和c語言熟練 所有程式都是順序執行的 python開發規範,每一行不能超過80個字元 python 注釋與c語言差別較大 單行注釋 多行注釋 input預設接受的是字串 注意型別的轉換 條件語句 例子 猜年齡遊戲 usr bin env python coding utf 8 autho...
LUA基礎學習第一天
迭代器 ipairs pairs function 函式 區域性,全域性,算數運算子 單行注釋 多行注釋 ctrl lua的8大資料結構 使用者,表,線,布,函,空,數,字,number 數值型別 string 字串型別 boolean 布林型別 function 函式 nil 空型別 table ...
go基礎學習第一天
package main import fmt func main 解讀 每乙個go原始碼的開頭都是使用package宣告 表示該go 所屬的包 包是go語言裡最基本的分發單位 也是工程管理中依賴關係的體現 要生成go可執行程式,必須要建立乙個名字為main的包 並且在該包中包含乙個叫main的函式...