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;
是吗?我知道这没有意义......
答案 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,变量j
和k
等于零。
因此,标识符的计算取决于目的以及块和网格的维度。例如,如果要计算线程的全局标识符以访问具有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感兴趣)。