CUDA简介——Grid和Block内Thread索引

1. 引言

前序博客:

Thread Index:

  • 每个Thread都有其thread index。
    • 在Kernel中,可通过内置的threadIdx变量来获取其thread index。threadIdx为三维的,有相应的(x,y,z)。
  • 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

猜你喜欢

转载自blog.csdn.net/mutourend/article/details/134780625