cuda編程 一

一個grid中包含多個block

一個block中包含多個thread

 

對於不同的 組織方式都有各自不同的存儲空間

每個thread---私有local memery

每個block--shared memery

對於每個設備device 共有的global memery。

 

CUDA中三類聲明

__global__ 定義一個kernel函數(數據並行處理函數)

  1. 入口函數,cpu上調用,GPU上執行
  2. 必須返回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中的線程可以:

  1.    同步synchronize
  2.     訪問共享存儲器shared memery
  3.     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 一般框架三步走

  1. 爲gpu內存分配空間(gpu上的輸入、輸出)
  2. 啓動並行kernel
  3. 將GPU上結果copy到cpu,並釋放步驟1上的分配空間

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章