cuda實現向量相加

2022-06-30 20:51:12 字數 2868 閱讀 8700

部落格最後附上整體**

如果有說的不對的地方還請前輩指出, 因為cuda真的接觸沒幾天

cuda 並不純gpu在執行程式, 而是 cpu 與 gpu 一起在執行程式, cpu負責排程, gpu 負責運算, cpu稱為**host **, gpu 稱為device

記住三個東西 grid block thread ,關係分別是 grid 包含多個 block , block 包含多個 thread

乙個block中thread個數選取一般為32的整數倍, 原因和warp有關, 有興趣自行查閱

乙個grid中block的個數選取和你的kernel函式以及thread數量有關, 舉個例子, int a[1000] 加上 int b[1000] , 你的thread為64, 那麼, block = 1000/64 = 16個合適

__global__函式一般表示乙個核心函式,是一組由gpu執行的平行計算任務,由cpu呼叫

__host__一般是由cpu呼叫,由cpu執行的函式,

__device__一般表示由gpu中乙個執行緒呼叫的函式

#include #include
__global__ void

vectoradd(float *a, float *b, float *c, int num)

}

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

這句**解釋一下:

blockdim.x 表示block的size行數(如果是一維的block的話,即一行有多少個thread)

blockidx.x 表示當前執行到的第幾個block(一維grid的話,即該grid中第幾個block)

threadidx.x 表示當前執行到的第幾個thread (一維的block的話.即該block中第幾個thread)

畫個**釋一下

比如上面這個圖的話, abcde各代表乙個block, 總的為乙個grid, 每個block中有四個thread, 圖中我花了箭頭的也就是代表著第1個block中的第0個thread.

那麼 i = blockdim.x * blockidx.x + threadidx.x 就是指 i = 4 * 1 + 0

host中申請記憶體

float *a = (float *)malloc(size);

float *b = (float *)malloc(size);

float *c = (float *)malloc(size);

free(a);

free(b);

free(c);

device中申請記憶體

float *da = null;

float *db = null;

float *dc = null;

cudamalloc((void **)&da, size);

cudamalloc((void **)&db, size);

cudamalloc((void **)&dc, size);

cudafree(da);

cudafree(db);

cudafree(dc);

cudamemcpy(da,a,size,cudamemcpyhosttodevice);

cudamemcpy(db,b,size,cudamemcpyhosttodevice);

cudamemcpy(dc,c,size,cudamemcpyhosttodevice);

cudamemcpyhosttodevice | cudamemcpyhosttohost | cudamemcpydevicetodevice | cudamemcpydevicetohost

int threadperblock = 256;                        

int blockpergrid = (num + threadperblock - 1)/threadperblock;

vectoradd <<< blockpergrid, threadperblock >>> (da,db,dc,num)

此處確定了block中的thread數量以及乙個grid中block數量

利用kernel function <<< blockpergrid, threadperblock>>> (paras,...) 來實現在cuda中運算

#include #include // vectoradd run in device

__global__ void

vectoradd(float *a, float *b, float *c, int num)

}// main run in host

intmain(void)

} printf("test passed\n");

// free device global memory

cudafree(da);

cudafree(db);

cudafree(dc);

// free host memory

free(a);

free(b);

free(c);

printf("free is ok\n");

return 0;

}

cuda 入門 向量相加

檔名為main.cu include include 兩個向量加法kernel,grid和block均為一維 global void add float x,float y,float z,int n int main 申請device記憶體 float d x,d y,d z cudamalloc...

CUDA (一) 基本裝置管理函式 向量相加

lz之前看過一點點的gpu的加速 後來發現要想寫好cuda 對硬體的理解,記憶體的理解,平行計算等要求還是很高的,然後就很慫的放棄了,沒有繼續下去,而且實驗室基本上都是做cv的,很少有同學做hpc,所以對這方面屬於真小白。直到前陣子,去gtc china,也還是小白,cuda也就用過最基礎的cuda...

CUDA( ) 向量求和運算

問題描述 將兩組資料對應的元素兩兩相加,並將結果儲存在第三個陣列中。即向量求和運算 目錄 1.基於cpu的向量求和 分析 問題 索引取值範為0 到 n 1 下面兩種函式add 有什麼區別嗎?完整的 實現及執行結果 2.基於gpu的向量求和 分析 問題 裡面引數式什麼含義?問題 既然gpu將執行ker...