【问题标题】:Why do I need block dimension in order to calculate the thread ID in CUDA?为什么我需要块维度才能计算 CUDA 中的线程 ID?
【发布时间】:2017-08-26 14:18:23
【问题描述】:

我是 CUDA 的新手,我已经阅读过它以及如何计算线程的 ID。我有一个关于线程 ID 的问题,例如,在 image 中可以看到。

我不明白为什么线程和块坐标不足以计算线程ID,而是我需要使用块尺寸。

【问题讨论】:

  • 图像实际上很好地显示了它。例如,有多个线程的(threadIdx.x,threadIdx.y)(1,2)。正如 ApoorvaJ 所指出的:为了获得 unique 索引,您还必须考虑该线程位于哪个 block 中,以及一个块中有多少个线程。

标签: cuda


【解决方案1】:

CUDA documentation中所见,多个线程共同组成一个块,多个这样的块形成一个网格。

现在,当需要唯一标识网格中的每个线程时,您必须考虑块尺寸。

在以下示例中,ij 一起唯一标识网格中的每个线程。

int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;

threadIdx 是块内线程的索引,blockIdx 是网格内块的索引。所以你必须有blockDim 才能获得网格内线程的唯一索引i, j

【讨论】:

  • 好的,但我仍然有同样的问题。为什么需要blockDim?抱歉,我知道这可能是一个愚蠢的问题。不能说:int i = blockIdx.x + threadIdx.x; int j = blockIdx.y + threadIdx.y;?这样我就知道块内的线程和网格内的块。为什么我需要一个块中有多少个线程(即块维度)?
  • 唯一标识整个grid中的每个thread。我建议您在纸上尝试尝试您所说的公式,并尝试以这种方式对每个线程进行唯一索引。恐怕我不知道如何进一步解释了。
【解决方案2】:

我们必须真正理解并能够想象,当内核启动和线程创建时,我们脑海中的物理可视化,以及 blockDim、blockIdx、threadIdx 的真正含义......

块维度 (BlockDim) 是 X 或 Y 或 Z 维度(取决于 .X、.Y 或 .Z)中每个 BLOCK 中的“线程数(计数)”。

BlockIdx.x 表示哪个线程位于哪个块中的索引号。块的索引号从零开始计数,从左到右 (x)、从上到下 (y)、从前到后 (z) 排序。

threadIdx.x 是每个块(blockIdx.x)中从零开始的本地索引。 但是,当它运行/生命时,我们应该知道“线程的全局索引”。所以它需要:

    uint globalIdx_x = blockIdx.X * blockDim.X + threadIdx.x;

尝试阅读和学习这本书: 专业的 CUDA C 编程——Wrox 编程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2010-12-26
    • 2021-06-12
    • 2019-01-27
    相关资源
    最近更新 更多