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

为什么我需要块尺寸来计算CUDA中的线程ID?,cuda,Cuda,我是CUDA的新手,我读过关于它以及如何计算线程ID的文章。我有一个关于线程ID的问题,例如可以在本文中看到 我不明白的是,为什么线程和块坐标不足以计算线程ID,而我需要使用块尺寸。如图所示,多个线程一起形成一个块,多个这样的块形成一个网格 现在,当网格中的每个线程都需要唯一标识时,必须考虑块尺寸 在下面的示例中,i和j一起唯一地标识网格中的每个线程 int i = blockIdx.x * blockDim.x + threadIdx.x; int j = blockIdx.y * bloc

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

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

如图所示,多个线程一起形成一个块,多个这样的块形成一个网格

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

在下面的示例中,
i
j
一起唯一地标识网格中的每个线程

int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
threadIdx
是块内线程的索引,
blockIdx
是网格内块的索引。因此,必须使用
blockDim
才能获得网格内线程的唯一索引
i,j

如图所示,多个线程一起形成一个块,多个这样的块形成一个网格

int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
现在,当网格中的每个线程都需要唯一标识时,必须考虑块尺寸

在下面的示例中,
i
j
一起唯一地标识网格中的每个线程

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

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

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

int i = blockIdx.x * blockDim.x + threadIdx.x;
int j = blockIdx.y * blockDim.y + threadIdx.y;
块尺寸(BlockDim)是X、Y或Z尺寸中每个块中的“线程数(计数)”(取决于.X、.Y或.Z)

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

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

    uint globalIdx_x = blockIdx.X * blockDim.X + threadIdx.x;
尝试阅读并从本书中学习:
专业的CUDA C编程——Wrox编程。

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

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

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

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

    uint globalIdx_x = blockIdx.X * blockDim.X + threadIdx.x;
尝试阅读并从本书中学习:
专业的CUDA C编程——Wrox编程。

图像实际上很好地显示了它。例如,有多个线程的
(threadIdx.x,threadIdx.y)
(1,2)
。正如ApoorvaJ所指出的:为了获得唯一的索引,你还必须考虑这个线程在哪个块中,以及一个块中有多少线程。这张图片实际上很好地显示了它。例如,有多个线程的
(threadIdx.x,threadIdx.y)
(1,2)
。正如ApoorvaJ所指出的:为了获得唯一的索引,你还必须考虑这个线程在哪个块中,以及一个块中有多少线程。好的,但我仍然有同样的问题。为什么需要
blockDim
?对不起,我知道也许这是个愚蠢的问题。可以说:
inti=blockIdx.x+threadIdx.x;int j=块idx.y+线程idx.y?这样我就知道了块中的线程和网格中的块。为什么我需要一个块中有多少线程(即块维度)?来唯一标识整个网格中的每个线程。我建议你尝试,在纸上,尝试你陈述的公式,并尝试以这种方式唯一地索引每个线程。恐怕我不知道如何进一步解释这个问题。好的,但我还有同样的问题。为什么需要
blockDim
?对不起,我知道也许这是个愚蠢的问题。可以说:
inti=blockIdx.x+threadIdx.x;int j=块idx.y+线程idx.y?这样我就知道了块中的线程和网格中的块。为什么我需要一个块中有多少线程(即块维度)?来唯一标识整个网格中的每个线程。我建议你尝试,在纸上,尝试你陈述的公式,并尝试以这种方式唯一地索引每个线程。恐怕我不知道如何进一步解释这一点。