一個grid中包含多個block
一個block中包含多個thread
對於不同的 組織方式都有各自不同的存儲空間
每個thread---私有local memery
每個block--shared memery
對於每個設備device 共有的global memery。
CUDA中三類聲明
__global__ 定義一個kernel函數(數據並行處理函數)
- 入口函數,cpu上調用,GPU上執行
- 必須返回void
__device__ GPU調用,GPU 執行
__host__ host調用,host執行
kernel 函數的調用方式
kernel函數定義 __global__ void function(A,B,C) {}
調用 function<<<num of block,num of thread>>>(A,B,C);
Grid 一維或者多維度線程塊
Block 一組線程(一維,二維或者三維)
一個grid裏面每個block的線程數是一樣的
每個block中的線程可以:
- 同步synchronize
- 訪問共享存儲器shared memery
- Barrier 塊內所有線程等待所有線程完成了再執行下面操作
線程索引 threadIdx
塊索引 blockIdx
CUDA 內存傳輸
GPU中分爲兩塊內存:1,global memory,2, constant memory
cudaMalloc() 在device端分配Global memory
cudaFree() 釋放存儲空間
float *M;//指向的設備端的地址,而不是主機端地址
int size = w*h*sizeof(float);
cudaMalloc((void**)&M,size)
cudaFree(M)
CUDA 內存傳輸
cudaMemcpy()
使用範圍 host to host;host to device,device to host; device to device
//cudaMemcpy(目的地址,源地址,大小,拷貝方向)
cudaMemcpy(Md,M,size,cudaMemcpyHostToDevice); //主機端 copy 設備端
cudaMemcpy(M,Md,size,cudaMemcpyDeviceToHost);//設備端 copy 主機端
CUDA 一般框架三步走
- 爲gpu內存分配空間(gpu上的輸入、輸出)
- 啓動並行kernel
- 將GPU上結果copy到cpu,並釋放步驟1上的分配空間