您如何计算所有可能的块尺寸的warpid?

时间:2014-03-01 21:47:54

标签: cuda

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

这适用于具有多个维度的块吗?

    int i = blockIdx.x * blockDim.x + threadIdx.x;
    int j = blockIdx.y * blockDim.y + threadIdx.y;
    int k = blockIdx.z * blockDim.z + threadIdx.z;

    int tid = i + j + k;

    int l = tid / warpSize;

是吗?我知道这没有意义......

1 个答案:

答案 0 :(得分:2)

计算线程ID(块唯一)并尊重线程在GPU上的组织方式:

int tid = threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y;

计算warp id: int warpid = tid / 32;

这样,具有相同warpid的线程属于同一个warp。

修改

如上所述,tid的计算只是块唯一的。您无法使用它来访问数组A, B, C的唯一索引。类似地,变量warpid仅存储块唯一的warp索引。

您的方法适用于一维块和网格的原因是表达式int i = blockIdx.x * blockDim.x + threadIdx.x;计算网格唯一线程ID,变量jk等于零。

因此,标识符的计算取决于目的以及块和网格的维度。例如,如果要计算线程的全局标识符以访问具有1D网格和3D块的某些全局内存数组:

int tid = threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y + blockIdx.x * blockDim.x * blockDim.y * blockDim.z; // number of threads in prior blocks

并且warp标识符的计算也取决于目的(您是否对全局或块唯一ID感兴趣)。