CUDA线程寻址((threadIdx.x,threadIdx.y,threadIdx.z)和块寻址(blockidx.x,blockidx.y)

Sto*_*ika 4 cuda

我只需要澄清一些非常基本的东西 - 大多数计算实例都使用类似的东西:

ID = blockIdx.x*blockDim.x + threadIdx.x;

// ...然后在数组[ID]上进行计算

我的问题是,如果我想使用的块(1024),那么我真的需要"建立"我的"线程ID"考虑所有的(线程的最大数量threadIdx.x,threadIdx.y,threadIdx.z)?

如果是这样,建议将其散列为单个值的方法是什么?

如果不是这样,为什么有人在图像处理相关的操作中以类似的方式使用它,例如在这篇文章中:

/sf/ask/805238451/

怎么样blockidx.xblockidx.y他们,是在同一鞋的threaIdx在这方面?

Rob*_*lla 9

通常会创建2D或3D线程块,因为问题适用于数据的2D或3D解释,并且使用2D或3D线程块处理它可能使代码更具可读性.但是没有具体的理由说明为什么不能使用具有适当索引的1D线程块.

创建2D或3D网格(块)通常是出于上述原因和/或绕过网格任意一维中块数量的前CC 3.0设备的限制(任意维度中65535个最大块) ).

对于threadblock情况,您可以在单个维度中的单个块中使用1024个线程,因此您无需使用threadIdx.y或不需要构建ID变量threadIdx.z.

如果你有一个预CC 3.0设备,并且你的问题在块方面足够大,你可能仍然想要构建一个2D网格.您仍然可以在该网格中使用1D线程块.在这种情况下,可以创建一个唯一的ID变量,如:

 int idx = threadIdx.x + (((gridDim.x * blockIdx.y) + blockIdx.x)*blockDim.x);  
Run Code Online (Sandbox Code Playgroud)

上述构造应该处理具有任何2D网格的1D线程块.

除了构建2D网格以处理大问题大小之外,还有其他方法,例如让您的块在某种循环中处理多个数据块.