我只需要澄清一些非常基本的东西 - 大多数计算实例都使用类似的东西:
ID = blockIdx.x*blockDim.x + threadIdx.x;
// ...然后在数组[ID]上进行计算
我的问题是,如果我想使用的块(1024),那么我真的需要"建立"我的"线程ID"考虑所有的(线程的最大数量threadIdx.x
,threadIdx.y
,threadIdx.z
)?
如果是这样,建议将其散列为单个值的方法是什么?
如果不是这样,为什么有人在图像处理相关的操作中以类似的方式使用它,例如在这篇文章中:
怎么样blockidx.x
和blockidx.y
他们,是在同一鞋的threaIdx
在这方面?
通常会创建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网格以处理大问题大小之外,还有其他方法,例如让您的块在某种循环中处理多个数据块.