我只需要澄清一些非常基本的内容--大多数计算示例都使用如下内容:
blockIdx.x*blockDim.x+threadIdx.x; ID=
// .然后在arrayID上进行计算
我的问题是,如果我想使用块(1024)中的最大线程数,那么我真的需要‘构造’我的'threadID‘并考虑到所有的(threadIdx.x,threadIdx.y,threadIdx.z)吗?
如果是这样的话,建议使用什么方法将其散列为单个值?
如果不是这样的话,为什么有人可以在图像处理相关操作中以类似的方式使用它,比如在本文中:
https://stackoverflow.com/questions/11503406/cuda-addressing-a-matrix
那么blockidx.x和blockidx.y呢?在这方面,他们和threaIdx穿的是同一双鞋吗?
发布于 2013-05-06 17:46:45
创建2D或3D线程块通常是因为问题会导致数据的2D或3D解释,使用2D或3D线程块来处理它可能会使代码更易读。但是没有具体的理由不能用一个具有适当索引的1D线程块来完成。
创建2D或3D网格(块的)通常是出于上述的原因和/或为了绕过在网格的任何一个维度(任意维中的65535个最大块)中的任何一个维度中的块数量的限制前CC 3.0设备。
对于线程块情况,可以在单个维度的单个块中使用1024个线程,因此如果不想使用threadIdx.y或threadIdx.z构造ID变量。
如果您有一个预CC3.0设备,并且您的问题在块方面足够大,您可能仍然想要构建一个2D网格。您仍然可以在那个网格中使用一维线程块。在这种情况下,可以创建一个唯一ID变量,如下所示:
int idx = threadIdx.x + (((gridDim.x * blockIdx.y) + blockIdx.x)*blockDim.x); 上面的构造应该处理任何2D网格的一维线程块。
除了构建一个2D网格以处理较大的问题大小之外,还有其他方法,例如让您的块在某种循环中处理多个数据块。
发布于 2014-12-16 16:10:44
这是罗伯特·克罗夫拉回答的基础:
创建2D/3D网格不仅是为了提高可读性,也是为了开发片上共享内存中的2D/3D局部性,从而提供更快的访问速度。如果您的问题在2D网格上工作,则无法有效地利用一维网格的这种局部性。
发布于 2013-05-06 17:47:09
在您的示例中,threadID是一个误导性术语。计算的值实际上是当前线程将读取或写入的数组中的索引。如果使用多个块调用内核,则需要以这种方式计算索引,以处理每个数组元素一次。
https://stackoverflow.com/questions/16403972
复制相似问题