为什么我需要块维度来计算CUDA中的线程ID?

时间:2016-11-21 13:37:32

标签: cuda

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

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

2 个答案:

答案 0 :(得分:3)

CUDA documentation所示,多个线程一起形成一个块,多个这样的块形成一个网格。

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

enter image description here

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

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

threadIdx是块中线程的索引,blockIdx是网格中块的索引。因此,您必须blockDim才能获得网格中线程的唯一索引i, j

答案 1 :(得分:0)

我们必须真正了解并且可以想象,当内核启动并创建线程时,我们头脑中的物理可视化,以及blockDim,blockIdx,threadIdx真正意味着什么......

块尺寸(BlockDim)是X或Y或Z尺寸(取决于.X,.Y或.Z)的每个BLOCK中的“THREADS的NUMBER(count)”。

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

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

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

尝试阅读并学习本书: 专业的CUDA C编程 - Wrox编程。