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() 重置设备,可以省略