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

时间:2014-04-01 03:06:28

标签: cuda

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

1 个答案:

答案 0 :(得分:5)

尽可能read in the documentation,变量threadIdxblockIdxblockDim是在每个执行线程上自动创建的变量。他们拥有.x.y.z属性,因此您可以根据需要将线程映射到问题空间。

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

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

kernel_function<<<blocks, threads>>>(kernel_parameters);

您正在启动名为kernel_function的内核函数,以便CUDA运行时启动维度为gX x gY x gZ的块的3D网格。这些块中的每一个都将包含线程,这些线程以大小为tX x tY x tZ的3D结构进行组织。

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

Official CUDA thread hierarchy

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

  • 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