我是CUDA的新手,我已阅读并了解如何计算线程的ID。我有一个关于线程ID的问题,例如,在这个image中可以看到。为什么我需要块维度来计算CUDA中的线程ID?
我不明白的是为什么线程和块坐标不足以计算threadID,而是我需要使用块维度。
我是CUDA的新手,我已阅读并了解如何计算线程的ID。我有一个关于线程ID的问题,例如,在这个image中可以看到。为什么我需要块维度来计算CUDA中的线程ID?
我不明白的是为什么线程和块坐标不足以计算threadID,而是我需要使用块维度。
如CUDA documentation所示,多个线程一起形成一个块,并且多个这样的块形成网格。
现在,当网格中的每个线程都需要唯一标识时,您必须考虑块维度。
在以下示例中,i
和j
一起唯一地标识网格中的每个线程。
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;'?这样我就知道块内的线程和网格内的块。为什么我需要块中有多少个线程(即块维度)? – chick3n0x07CC
为了唯一标识整个_grid_中的每个_thread_。我建议你在纸上试着尝试你陈述的公式,并尝试以这种方式唯一地为每个线索索引。恐怕我不知道如何进一步解释这一点。 – ApoorvaJ
我们必须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的编程。
图像实际上很好地显示它。例如,'(threadIdx.x,threadIdx.y)'是'(1,2)'有多个线程。正如ApoorvaJ指出的那样:为了获得**唯一的**索引,您还必须考虑该线程的哪个*块*以及一个块中有多少个线程。 – Marco13