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

CUDA中threadidx.x(.y,.z)、blockidx.x等的值,cuda,Cuda,我知道我使用threadidx.x等来引用特定线程,但我正在从CPU中的for循环传输代码,并且希望使用threadidx.x引用数字0…N,但这似乎不起作用。我将tdx=threadIdx.x声明为整数,但tdx中实际存储的是哪个整数?尽可能多地说,变量threadIdx、blockIdx和blockDim是在每个执行线程上自动创建的变量。它们具有.x、.y和.z属性,因此您可以将线程映射到您认为合适的问题空间 在执行内核时,确定每个块在3D中有多少线程,以及在3D网格中有多少块。在以下代码中

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

尽可能多地说,变量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运行时启动一个由尺寸为gXxgYxgZ的块组成的3D网格。这些块中的每一块都将包含以TXXTZ大小的3D结构组织的线程

如果三维尺寸为0,即二维映射,则官方文档的图片会更好地显示:

这意味着对于执行内核的每个线程,以下情况都是正确的:

blockDim.x=tX blockDim.y=tY blockDim.z=tZ gridDim.x=gX gridDim.y=gY gridDim.z=gZ 每个线程在这些参数内都有自己的坐标。数学上:


0 PS:这是一个非常基本的CUDA问题,我建议您阅读官方的CUDA编程指南threadDim是什么??您已经将一些内置变量弄糊涂了。栅格尺寸是以块为单位的gridDim.x、y、z。块尺寸是以螺纹为单位的blockDim.x、y、z。每个块在网格中都有一个唯一的索引块idx.x、y、z。唯一的线程内置变量是threadIdx.x,y,z,这是线程索引,在块中是唯一的。关于变量名,您是正确的,我已经更正了。请注意:午夜后不应回答SO问题