Cuda程序的執行模型
Cuda中線程的組織方式
l blockDim: 線程塊的組織和大小,如
l gridDim: 線程網格的組織形式,包含多少個線程塊,如
l threadIdx: 線程塊中的位置 。其中
l blockIdx: 線程塊在線程網格中的位置 ,其中
比如int x=blockIdx.x*blockDim.x+threadIdx.x;
int y=blockIdx.y*blockDim.x+threadIdx.y;
int z=blockIdx.z*blockDim.z+threadIdx.z;
對於一個Kenerl形式 foo<<<網格形式,線程塊形式>>>
如dim3 block(3,2), 定義了3*2的網格
Foo<<<4,25>>形式
對於int x=blockIdx.x*blockDim.x+threadIdx.x;而言,
爲25,即blockDim.x=24, 爲4,blockIdx範圍在[0,3],這樣,對於x的取值範圍就在[0,99]了
l
Cuda編程7步曲:
l cudaSetDeivec(i) 獲取設備
l cudaMalloc((void**)&d_a,sizeof(float)*n) 分配顯存
l cudaMemcpy(設備指針,主機指針,傳輸大小,cudaMemcpyHostToDevice) 由主機將數據傳到設備
l gpu_kernel<<<blocks,threads>>>(參數列表); kernel函數,並行部分
l cudaMemcpy(主機指針,設備指針,傳輸大小,cudaMemcpyHDeviceToHost) 由設備將數據傳到主機
l cudaFree(d_a) 釋放顯存
l cudaDeviceReset() 重置設備,可以省略