我理解我使用threadidx.x等来引用一个特定的线程,但是我在CPU中从for循环传输代码,并希望使用threadidx.x引用数字0 ... N,但这并不是似乎工作。我将tdx = threadIdx.x声明为整数,但实际存储在tdx中的是什么整数?
答案 0 :(得分:5)
尽可能read in the documentation,变量threadIdx
,blockIdx
和blockDim
是在每个执行线程上自动创建的变量。他们拥有.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映射),官方文档的图片会更好地显示:
这意味着执行内核的每个线程都会出现以下情况:
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