GPU 高效能程式設計 CUDA 執行緒協作

2021-08-19 20:35:00 字數 2064 閱讀 3441

並行執行緒塊的分解:

在向量加法中,為向量中的每乙個元素都啟動乙個執行緒塊

add<<>>(dev_a,dev_b,dev_c);
尖括號中的第乙個引數建立的執行緒塊的數量,第二個引數表示每個執行緒塊中建立的執行緒數量,所以上述啟動的執行緒數量為 n (     n*1)

使用執行緒實現 gpu 上的向量求和:

需要修改兩個地方,第乙個地方是

add<<>>(dev_a,dev_b,dev_c);

add<<<1,n>>>(dev_a,dev_b,dev_c);

第二個地方是

int tid=blockidx.x;

int tid=threadidx.x;

硬體執行緒塊的數量限制為 65535,每個執行緒塊中的執行緒數量不超過裝置屬性中的 maxtreadsperblock 域的值

在 gpu 上對更長的向量求和:

和之前一樣,改動兩個地方:核函式中索引的計算方法和核函式的呼叫方式

int tid = threadidx.x + blockidx.x*blockdim.x;

add<<>>(dev_a,dev_b,dev_c);

類似於julia 中將二維影象索引線性化

示例中假定每乙個執行緒塊有 128 個執行緒數,可以啟動 n/128 個執行緒塊進行計算,但是這是乙個整除除法,所以加 127 保證可以啟動足夠多的執行緒塊,在核函式中訪問數組合輸出陣列之前一定要檢查索引是否在 0 到 n 之間,保證索引不超過陣列的邊界

在 gpu 上對任意長度的向量求和:

如果當向量的長度大於 65535*129=8388480 時,核函式會呼叫失敗

首先對核函式進行一些修改

_global_ void add(int *a,int *b,int *c)

//設定 cache 中相應位置的值

cache[cacheindex]= tmp ;

//對執行緒塊中的執行緒進行同步

_syncthreads();

//對 cache 內資料進行規約計算

int i = threadsperblock/2;

while(i !=0)

if(cacheindex == 0)

}}int main(void){

float *a,*b,c,*partial_c;

float *dev_a,*dev_b,*partial_c;

//cpu上分配記憶體

a=(float*)malloc(n*sizeof(float));

b=(float*)malloc(n*sizeof(flota));

partial_c=(float*)malloc(blockspergrid*sizeof(float));

//gpu 上分配記憶體

cudamalloc((void**)&dev_a,n*sizeof(float));

cudamalloc((void**)&dev_b,n*sizeof(float));

cudamalloc((void**)&partial_c,blockspergrid*sizeof(float));

//填充主機記憶體

for(int i=0;i>>(dev_a,dev_b,dev_partial_c);

//將陣列 c 複製到 cpu

cudamemcpy(partial_c,dev_partial_c,blockpergrid*sizeof(float),cudamemcpydevicetohost);

//在 cpu 上完成最後的求和運算

c = 0;

for(int i = 0;i

GPU高效能程式設計CUDA實戰 第5章執行緒協作

add dev a,dev b,dev c 第乙個引數 啟動的執行緒塊數量。第二個引數 每個執行緒塊中建立的執行緒數量。1.使用執行緒實現gpu上的向量求和 add loop blocks.cu 啟動n個執行緒塊,每個執行緒塊對應乙個執行緒 add dev a,dev b,dev c 改為啟動n個執...

GPU高效能程式設計CUDA實戰 二

接下來實施 三步走戰略 配置 附加包含目錄 附加庫目錄 以及 附加依賴項 第一步 配置 附加包含目錄 注 對於cuda samples,有的電腦安裝後的路徑會隱藏,我們可以在 開始 按鈕處查詢,見下圖。第二步 配置 附加庫目錄 第三步 配置 附加依賴項 最後,驗證一下配置是否成功。在新建的工程mai...

《GPU高效能程式設計CUDA實戰》學習筆記(五)

add dev a,dev b,dev c 尖括號中 n 開啟了n個執行緒塊 1 每個執行緒塊中建立1個執行緒。共啟動的執行緒數量 n個執行緒塊 1個執行緒 執行緒塊 n個並行執行緒 本節完成上一章相同任務。但執行緒塊中的並行能完成並行執行緒塊無法完成的工作。1.使用執行緒實現gpu上的向量求和 1...