CUDA简介——Grid和Block内Thread索引
1. 引言
前序博客:
- CUDA简介——基本概念
- CUDA简介——编程模式
- CUDA简介——For循环并行化
Thread Index:
- 每个Thread都有其thread index。
- 在Kernel中,可通过内置的
threadIdx
变量来获取其thread index。threadIdx
为三维的,有相应的(x,y,z)。
- 在Kernel中,可通过内置的
- Thread Blocks最多有3个维度,因此,每个维度都有相应的index:
- threadIdx.x
- threadIdx.y
- threadIdx.z
如:
使用threadIdx
,足以确定某Thread在单个block内的位置,但该threadIdx
,在整个grid来看,其是不唯一的。
如,启动kernel时配置的grid的x维度有2个block,且每个block内的x维度有4个Threads,则这2个block内的threadIdx.x
的取值范围均为0到3:
为从整个grid来唯一索引Thread,需额外再引入一些索引变量:
- Thread Index:以
dim3 threadIdx
来表示,有threadIdx.x、threadIdx.y、threadIdx.z。 - Block Index:以
dim3 blockIdx
来表示,有blockIdx.x、blockIdx.y、blockIdx.z。 - Block Dimension:以
dim3 blockDim
来表示,有blockDim.x、blockDim.y、blockDim.z。 - Grid Dimension:以
dim3 gridDim
来表示,有gridDim.x、gridDim.y、gridDim.z。
从而,Grid内索引:
threadIdx
仅在其自身Thread Block内是唯一的。- 为唯一表示某Thread在Grid内的唯一索引,需计算:【几乎每个CUDA kernel,都需要确定其Thread在Grid内的唯一索引】
如:
通过如下例子,可更好地理解各个index值的含义。
参考资料
[1] 2019年5月视频 Intro to CUDA (part 4): Indexing Threads within Grids and Blocks