-2

我对线程编号和线程 ID 几乎没有疑问。

  1. 2D-Thread(1,0) 是线程 1,因为它的 x 索引是 1,y 索引是 0。然后是 thread(0,1) 这个线程的线程 id 或线程号是什么?我觉得它是3,但如何?我们如何将 ThreadId = blockIdx.x*blockDim.x + threadIdx.x 的公式应用于线程(0,1)?如何使用此公式计算线程(0,1)的线程 ID 值,例如块 3?或者有不同的公式,如何找到?如何为 3D 做?

  2. 我们如何确定总数。x 方向的螺纹在一起?例如:如果我正在访问矩阵元素。矩阵大小为 3,然后我知道线程(0,0)将访问第一个元素,线程(1,0)将访问第二个元素,线程(2,0)将访问第三个元素,然后线程(0,1)将访问第 2 行的第 1 个元素(第 4 个元素)。但是从这张图片中如何忽略线程(3,0)?哪个元素 thread(3,0) 将访问以及如何访问?这取决于执行配置,我在哪里给出了块大小和网格大小?

4

1 回答 1

2

threadIdx 是一个带有 .x、.y 和 .z 字段的结构。将其写为“thread(x,y)”可能会令人困惑。

  1. 您正在创建 2D 线程块并尝试将其映射到 1D 索引。当然你可以这样做,但是 2D 到 1D 的映射将取决于你的应用程序的上下文。如果他们真的想要一维索引,大多数人会使用一维!

    当然,您可能需要获取 2D 线程索引并访问线性数组,但数组的布局将取决于应用程序。一个典型的例子是offset = threadIdx.y * arraywidth + threadIdx.x.

  2. x 方向的线程总数为gridDim.x * blockDim.x

    给定线程访问哪个元素取决于您选择如何计算偏移量(参见 (1))。

Talonmies 还向您指出了文档的Thread Hierarchy部分,这是一个很好的起点。

于 2012-11-19T13:20:02.070 回答