CUDA中threadidx.x(.y,.z),blockidx.x等的值

use*_*451 0 cuda

我理解我使用threadidx.x等来引用一个特定的线程,但我从一个CPU中的for循环传输代码,并希望使用threadidx.x引用数字0 ... N,但这似乎不是上班.我将tdx = threadIdx.x声明为整数,但实际存储在tdx中的整数是多少?

Too*_*ote 6

正如你可以在文档中读取的变量threadIdx, blockIdx并且blockDim是被在每次执行线程自动创建变量.他们.x,.y.z性能,让您可以在您认为合适的线程映射到你的问题的空间.

执行内核时,您可以确定每个块将拥有多少个线程(以3D为单位)以及3D网格中有多少个块.在以下代码中:

dim3 threads(tX, tY, tZ);
dim3 blocks(gX, gY, gZ);

kernel_function<<<blocks, threads>>>(kernel_parameters);
Run Code Online (Sandbox Code Playgroud)

您正在启动名为的内核函数,kernel_function以便CUDA运行时启动维度为gXx gYx 的块的3D网格gZ.这些块中的每一个都将包含以大小为tXx tYx 的3D结构组织的线程tZ.

如果第3维的大小为0(即它是2D映射),官方文档的图片会更好地显示:

官方CUDA线程层次结构

这意味着执行内核的每个线程都会出现以下情况:

  • blockDim.x = tX
  • blockDim.y = tY
  • blockDim.z = tZ
  • gridDim.x = gX
  • gridDim.y = gY
  • gridDim.z = gZ

并且每个线程在这些参数中都有自己的坐标.数学:

  • 0 <= threadIdx.x < blockDim.x = tX
  • 0 <= threadIdx.y < blockDim.y = tY
  • 0 <= threadIdx.z < blockDim.z = tZ
  • 0 <= blockIdx.x < gridDim.x = gX
  • 0 <= blockIdx.y < gridDim.y = gY
  • 0 <= blockIdx.z < gridDim.z = gZ

  • 什么是`threadDim` ?? 你的一些内置变量很混乱.网格尺寸是以网格为单位的"gridDim.x,y,z".块尺寸是以线程为单位的"blockDim.x,y,z".每个块在网格中都有一个唯一的索引`blockIdx.x,y,z`.唯一的线程内置变量是`threadIdx.x,y,z`,它是线程索引,在块中是唯一的. (2认同)