cuda多维线程的实例
1、注意:在多维中的变化时与平常的不一样,如下图所示,横向变换x,纵向变换y
2、cuda内置变量:
1、thread(线程):
一个线程可作为一个运算单元,多个thread可组成一个block(块).
threadIdx.x
:block中当前thread在x方向上的ID.
threadIdx.y
:block中当前thread在y方向上的ID.
2、block(块):
一个block中可包含多个thread,多个block可组成一个grid(网格).
blockIdx.x:grid中当前block在x方向上的ID.
blockIdx.y:grid中当前block在y方向上的ID.
blockDim.x:当前block中x方向上的thread数量.
blockDim.y:当前block中y方向上的thread数量.
3、grid(网格):
一个grid中可包含多个block.
gridDim.x
:当前grid中在x方向上的block数量.
gridDim.y
:当前grid中在y方向上的block数量.
3、网格与线程块大小的限制
gridDim.x最大值--------2^31 - 1
gridDim.y最大值--------2^16 - 1
gridDim.z最大值--------2^16 - 1
blockDim.x最大值----------1024
blockDim.y最大值-----------1024
blockDim.z最大值-----------64
注意:线程块总的大小最大为1024!
4、二维网格、二维线程块
//二维网格、二维线程块
int tid = threadidx.y * blockDim.x + threadidx.x;
int bid =blockidx.y * gridDim.x + blockidx.x;
int id = blockId * (blockDim.x * blockDim.y) + tid;
5、三维网格、三维线程块:
//三维线程块
int tid = threadIdx.z * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;
int bid = blockIdx.z * gridDim.x * gridDim.y + blocklIdx.y * gridDim.x + blockIdx.x;
int id = bid * (blockDim.x * blockDim.y * blockDim.z) + tid;
6、其他多种组合
//一维网格、一维线程块
int bid = blockIdx.x;
int id = blockIdx.x * blockDim.x + threadIdx.x;//二维网格、一维线程块
int bid = blockIdx.y * gridDim.x + blockIdx.x;
int id = bid * blockDim.x + threadIdx.x;//一维网格、二维线程块
int bid = blockIdx.x;
int id = blockIdx.x * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;//二维网格、二维线程块
int bid = blockIdx.y * gridDim.x + blockIdx.x;
int id = bid * blockDim.x * blockDim.y + threadIdx.y * blockDim.x + threadIdx.x;//一维网格、三维线程块
int bid = blockIdx.x;
int id = blockIdx.x * blockDim.x * blockDim.y * blockDim.z+ threadIdx.z * blockDim.y * blockDim.x+ threadIdx.y * blockDim.x + threadIdx.x;//二维网格、三维线程块
int bid = blockIdx.y * gridDim.x + blockIdx.x;
int id = blockIdx.x * blockDim.x * blockDim.y * blockDim.z+ threadIdx.z * blockDim.y * blockDim.x+ threadIdx.y * blockDim.x + threadIdx.x;
7 、定义多维网格和线程块(c++构造函数语法):
dim3 grid_size(Gx, Gy, Gz); //多维网格定义
dim3 block_size(Bx, By, Bz); //多维线程块定义