2016-11-21 75 views
0

我是CUDA的新手,我已阅读并了解如何计算线程的ID。我有一个关于线程ID的问题,例如,在这个image中可以看到。为什么我需要块维度来计算CUDA中的线程ID?

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

+2

图像实际上很好地显示它。例如,'(threadIdx.x,threadIdx.y)'是'(1,2)'有多个线程。正如ApoorvaJ指出的那样:为了获得**唯一的**索引,您还必须考虑该线程的哪个*块*以及一个块中有多少个线程。 – Marco13

回答

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

+0

好的,但我仍然有同样的问题。为什么'blockDim'需要?对不起,我知道这可能是一个愚蠢的问题。这样就不会说:'int i = blockIdx.x + threadIdx.x; int j = blockIdx.y + threadIdx.y;'?这样我就知道块内的线程和网格内的块。为什么我需要块中有多少个线程(即块维度)? – chick3n0x07CC

+3

为了唯一标识整个_grid_中的每个_thread_。我建议你在纸上试着尝试你陈述的公式,并尝试以这种方式唯一地为每个线索索引。恐怕我不知道如何进一步解释这一点。 – ApoorvaJ

0

我们必须really2了解并能想象当内核推出和线程的创建,以及什么blockDim,blockIdx,threadIdx真的是我们的头,物理可视化....

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

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

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

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

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

相关问题