首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA线程寻址(线程Idx.x,线程Idx.y,线程Idx.z)和块寻址

CUDA线程寻址(线程Idx.x,线程Idx.y,线程Idx.z)和块寻址
EN

Stack Overflow用户
提问于 2013-05-06 17:29:37
回答 4查看 23.3K关注 0票数 6

我只需要澄清一些非常基本的内容--大多数计算示例都使用如下内容:

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

// .然后在arrayID上进行计算

我的问题是,如果我想使用块(1024)中的最大线程数,那么我真的需要‘构造’我的'threadID‘并考虑到所有的(threadIdx.xthreadIdx.ythreadIdx.z)吗?

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

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

https://stackoverflow.com/questions/11503406/cuda-addressing-a-matrix

那么blockidx.xblockidx.y呢?在这方面,他们和threaIdx穿的是同一双鞋吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-06 17:46:45

创建2D或3D线程块通常是因为问题会导致数据的2D或3D解释,使用2D或3D线程块来处理它可能会使代码更易读。但是没有具体的理由不能用一个具有适当索引的1D线程块来完成。

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

对于线程块情况,可以在单个维度的单个块中使用1024个线程,因此如果不想使用threadIdx.ythreadIdx.z构造ID变量。

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

代码语言:javascript
复制
 int idx = threadIdx.x + (((gridDim.x * blockIdx.y) + blockIdx.x)*blockDim.x);  

上面的构造应该处理任何2D网格的一维线程块。

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

票数 10
EN

Stack Overflow用户

发布于 2014-12-16 16:10:44

这是罗伯特·克罗夫拉回答的基础:

创建2D/3D网格不仅是为了提高可读性,也是为了开发片上共享内存中的2D/3D局部性,从而提供更快的访问速度。如果您的问题在2D网格上工作,则无法有效地利用一维网格的这种局部性。

票数 1
EN

Stack Overflow用户

发布于 2013-05-06 17:47:09

在您的示例中,threadID是一个误导性术语。计算的值实际上是当前线程将读取或写入的数组中的索引。如果使用多个块调用内核,则需要以这种方式计算索引,以处理每个数组元素一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16403972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档