blockIdx是一个uint3类型,表示一个线程块的索引,一个线程块中通常有多个线程
blockIdx.x是块在X方向上的索引,
blockIdx.y是块在Y方向上的索引,
threadIdx.x是线程在X方向上的索引(在自己的线程块内),
threadIdx.y是线程在Y方向上的索引,
blockDim是一个dim3类型,表示线程块的大小。
blockDim.x是块在X方向上的线程数,(在X方向上每一块有多少个线程)
blockDim.y是块在Y方向上的线程数,(在Y方向上每一块有多少个线程)
gridDim.x表示x方向有几个block
使用N个线程块,每一个线程块只有一个线程,即
dim3 dimGrid(N);
dim3 dimBlock(1);
此时的线程号的计算方式就是
threadId = blockIdx.x;
使用一个线程块,该线程具有N个线程,即
dim3 dimGrid(1);
dim3 dimBlock(N);
此时线程号的计算方式为
threadId = threadIdx.x;
使用M×N个线程块,每个线程块1个线程
由于线程块是2维的,故可以看做是一个M*N的2维矩阵,其线程号有两个维度,即
dim3 dimGrid(M,N);
dim3 dimBlock(1);
其中
blockIdx.x 取值0到M-1
blcokIdx.y 取值0到N-1
pos = blockIdx.y * blcokDim.x + blockIdx.x;---线程序列号是从上到下后从左到右
使用M个线程块,每个线程块内含有N个线程,即
dim3 dimGrid(M);
dim3 dimBlock(N);
这种情况,可以把它想象成二维矩阵,矩阵的行与线程块对应,矩阵的列与线程编号对应,那线程号的计算方式为
threadId = threadIdx.x + blcokIdx*blockDim.x;------------简单地,只需要在x方向上做计算
使用M×N的二维线程块,每一个线程块具有P×Q个线程,即
dim3 dimGrid(M, N);
dim3 dimBlock(P, Q);
其索引有两个维度
threadId.x = blockIdx.xblockDim.x+threadIdx.x;
threadId.y = blockIdx.yblockDim.y+threadIdx.y;
变量类型限定符:用来确定某个变量在设备上的内存位置
device表示位于全局内存空间,默认类型
share表示位于共享内存空间
constant表示位于常量内存空间
texture表示其绑定的变量可以被纹理缓存加速访问
网友评论