二维/三维CUDA块如何划分为扭曲?

二维/三维CUDA块如何划分为扭曲?,cuda,gpgpu,gpu-warp,Cuda,Gpgpu,Gpu Warp,如果我用块具有维度的网格启动内核: dim3 block_dims(16,16); 网格块现在如何拆分为扭曲?这样一个块的前两行是形成一个扭曲,还是形成前两列,还是任意排列 假设GPU计算能力为2.0。线程在块内按顺序编号,以便threadIdx.x变化最快,然后threadIdx.y变化第二快,而threadIdx.z变化最慢。这在功能上与多维数组中的列主顺序相同。按此顺序从螺纹依次构造翘曲。因此,二维块的计算是 unsigned int tid = threadIdx.x + thread

如果我用块具有维度的网格启动内核:

dim3 block_dims(16,16);
网格块现在如何拆分为扭曲?这样一个块的前两行是形成一个扭曲,还是形成前两列,还是任意排列


假设GPU计算能力为2.0。

线程在块内按顺序编号,以便
threadIdx.x
变化最快,然后
threadIdx.y
变化第二快,而
threadIdx.z
变化最慢。这在功能上与多维数组中的列主顺序相同。按此顺序从螺纹依次构造翘曲。因此,二维块的计算是

unsigned int tid = threadIdx.x + threadIdx.y * blockDim.x;
unsigned int warpid = tid / warpSize;

编程指南和PTX指南都介绍了这一点。

线程在块内按顺序编号,因此
threadIdx.x
变化最快,然后
threadIdx.y
变化第二快,而
threadIdx.z
变化最慢。这在功能上与多维数组中的列主顺序相同。按此顺序从螺纹依次构造翘曲。因此,二维块的计算是

unsigned int tid = threadIdx.x + threadIdx.y * blockDim.x;
unsigned int warpid = tid / warpSize;

这在编程指南和PTX指南中都有介绍。

通过“Visual Studio WarpWatch”窗口演示@talonmies对两个连续扭曲的回答(
dim3 block_dims(16,16);
和WarpSize=32):


通过“Visual Studio WarpWatch”窗口为两个连续扭曲(
dim3 block_dims(16,16);
和WarpSize=32)演示@talonmies的答案:

注意“列主顺序”假设dim3是一个数组,而不是一个结构。更精确的描述是,
.x
是维度中变化最快的,
.y
是变化第二快的,
.z
变化最慢的。如何将
.x
.y
.z
与内存中的行、列、片、偏移量、树级别或任何其他寻址相关联取决于您。注意,“列主顺序”假设dim3是一个数组,而不是一个结构。更精确的描述是,
.x
是维度中变化最快的,
.y
是变化第二快的,
.z
变化最慢的。如何将
.x
.y
.z
与内存中的行、列、片、偏移量、树级别或任何其他寻址相关联取决于您。