为什么我需要块尺寸来计算CUDA中的线程ID?
我是CUDA的新手,我读过关于它以及如何计算线程ID的文章。我有一个关于线程ID的问题,例如可以在本文中看到 我不明白的是,为什么线程和块坐标不足以计算线程ID,而我需要使用块尺寸。如图所示,多个线程一起形成一个块,多个这样的块形成一个网格 现在,当网格中的每个线程都需要唯一标识时,必须考虑块尺寸 在下面的示例中,为什么我需要块尺寸来计算CUDA中的线程ID?,cuda,Cuda,我是CUDA的新手,我读过关于它以及如何计算线程ID的文章。我有一个关于线程ID的问题,例如可以在本文中看到 我不明白的是,为什么线程和块坐标不足以计算线程ID,而我需要使用块尺寸。如图所示,多个线程一起形成一个块,多个这样的块形成一个网格 现在,当网格中的每个线程都需要唯一标识时,必须考虑块尺寸 在下面的示例中,i和j一起唯一地标识网格中的每个线程 int i = blockIdx.x * blockDim.x + threadIdx.x; int j = blockIdx.y * bloc
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代码>?这样我就知道了块中的线程和网格中的块。为什么我需要一个块中有多少线程(即块维度)?来唯一标识整个网格中的每个线程。我建议你尝试,在纸上,尝试你陈述的公式,并尝试以这种方式唯一地索引每个线程。恐怕我不知道如何进一步解释这一点。