一、CUDA程序层次结构
GPU上很多并行化的轻量级线程。
kernel在device上执行时实际上时启动很多线程,一个kernel所启动的所有线程称为一个网格grid。
同一个网格上的线程共享相同的全局内存空间,grid时线程结构的第一个层次。
网格又可以分为很多线程块block,一个线程块里面包含很多线程,这是第二个层次。
warp:32个线程组成一个warp,这是第三个层次
grid和block都是定义为dim3类型的变量,dim3可以看成是包含三个无符号整数(x,y,z)成员的结构体变量,在定义时,缺省值初始化为1。 grid 和 block可以灵活地定义为1-dim,2-dim以及3-dim结构。定义的grid和block如下所示,kernel在调用时也必须通过执行配置<<<grid,block>>>来指定kernel所使用的线程数和结构。不同的GPU架构,grid和block的维度有限制。
一个线程需要两个内置的坐标变量(blockIdx,threadIdx)来唯一标识,它们都是dim3类型变量,其中blockIdx知名线程所在grid中的位置,而threadIdx知名线程所在block的位置。
threadIdx包含三个值:threadIdx.x threadIdx.y threadIdx.y
blockIdx同样也包含三个值:blockIdx.x blockIdx.y blockIdx.z
逻辑顺序:X>Y>Z