我对线程编号和threadID几乎没有疑问。
2D-Thread(1,0)是线程1,因为它的x索引是1而y索引是0.然后是线程(0,1)这个线程的线程ID或线程号是什么?我觉得它是3,但是怎么样?我们如何为线程(0,1)应用ThreadId = blockIdx.x * blockDim.x + threadIdx.x的公式?我怎样才能使用这个公式计算线程(0,1)的threadID值,比如块3?或者有不同的公式,如何找到?如何做3D?
我们如何确定总数。 x方向的线程在一起? 例如:如果我正在访问矩阵元素。矩阵大小是3,然后我理解线程(0,0)将访问第一个元素,线程(1,0)将访问第二个元素,线程(2,0)将访问第三个元素,然后线程(0,1)将访问第2行的第1个元素(第4个元素)。 但是如何从这张图片中忽略线程(3,0)?哪个元素线程(3,0)将访问以及如何访问? 这取决于执行配置,我给出了块大小和网格大小?
答案 0 :(得分:2)
threadIdx是一个包含.x,.y和.z字段的结构。将其写成“thread(x,y)”可能会令人困惑。
您正在创建2D线程块并尝试将其映射到1D索引。当然你可以做,但2D到1D的映射将取决于你的应用程序的上下文。如果他们真的想要一维索引,大多数人都会使用1D!
当然,您可能需要采用2D线程索引并访问线性数组,但数组的布局将依赖于应用程序。一个典型的例子就是offset = threadIdx.y * arraywidth + threadIdx.x
。
x方向的线程总数为gridDim.x * blockDim.x
。
给定线程访问哪个元素取决于您选择计算偏移的方式(参见(1))。
Talonmies还指出了文档的Thread Hierarchy部分,这是一个很好的起点。