一、一维网格
block = 2 线程块的数量
thread = 32 线程数量(一个线程块中)
int id = threadIdx.x + blockIdx.x*blockDim.x;
//x表示横向
//Idx表示索引 ,从0开始
//dim表示维度 ,blockDim表示一个线程块中线程的数量
//假设我们要计算最后一个线程的id,那么公式为
int id = 31 + 1*32 // = 63 总共有62个线程最后一个线程的id为【63】
//31 表示当前块中线程的索引
//1*32 表示每个块中线程的总数
二、二维网格
注意:这里给每个块中的索引编号了,其实每一行的索引都应该是0-31,后同
dim3 gird(2,2) //x方向2个线程块 ,y 方向两个线程块
dim3 block(32,4) // x方向线程数量32 ,y方向线程数量4
int block = blockIdx.x + blockIdx.y*gridDim.x
int thread = threadIdx.x + threadIdx.y*blockDim.x;
int id = thread + block*(blockDim.x*blockDim.y);
//y表示纵向(也就是从上往下)
//gridDim 表示线程块的数量 x表示横向线程块数量,y表示纵向线程块数量
//假设我们要计算block3中最后一个线程的id,那么公式为
int block = 1 + 1*2;//3
int thread = 31 + 3*32;//127
int id = 127 + 3*(32*4);//511
// block 表示当前块
// thread 表示当前块中thread 的索引
// 3*(32*4) 表示前面块中所有线程的总数
三、三维网格
dim3 grid (2,2,2) //x方向2个线程块,y方向2个线程块,z方向2页 222即为线程块总数量
dim3 block(32,4,2) //x方向32线程数量,y方向4线程数量,z方向2页 3242即为每个块中线程总数量
int block = blockIdx.x + (blockIdx.y*girdDim.x) + //当前页中线程块的索引
gridDim.x*gridDim.y*blockIdx.z //前一页中线程块的总数
int thread = threadIdx.x + (threadIdx.y*blockDim.x) + //当前线程块中 当前页的线程索引
blockDim.x*blockDim.y*threadIdx.z //当前线程块中 前一页线程数量
int id = thred + block*(blockDim.x*blockDim.y*blockDim.z)
//z表示每一个线程块中的线程页数
//假设我们要计算最后一个线程的索引
int block = 1+1*2 + 2*2*1 ;//7 当前线程块的索引
int thread =127 + 32*4*1 ;// 255 当前线程块中线程的索引
int id = 255 + 7*(32*4*3);//2047 (32*4*3)表示每个线程块中线程总数