CUDA:每个经纱选择一条线

CUDA:每个经纱选择一条线,cuda,Cuda,对于一些操作,我只想为每个扭曲选择一个线程 例如,让我们从(64,1,1)的一维块尺寸开始。据我所知,考虑到扭曲尺寸为32,这将导致两个扭曲。在这种情况下,我可以使用以下代码访问每个扭曲一个线程: if(threadIdx.x % 32 == 0) { ... } 首先,这有意义吗,因为我不确定我们是否知道线程是如何映射到硬件上的扭曲的 其次,对于(32,32,1)的二维块dim,如何实现这一点?现在这里简单的%32将不起作用,因为两个维度中的线程索引将不同 谢谢。块中的线程以一致的方式映射到

对于一些操作,我只想为每个扭曲选择一个线程

例如,让我们从
(64,1,1)
的一维块尺寸开始。据我所知,考虑到扭曲尺寸为32,这将导致两个扭曲。在这种情况下,我可以使用以下代码访问每个扭曲一个线程:

if(threadIdx.x % 32 == 0) { ... }
首先,这有意义吗,因为我不确定我们是否知道线程是如何映射到硬件上的扭曲的

其次,对于
(32,32,1)
的二维块dim,如何实现这一点?现在这里简单的
%32
将不起作用,因为两个维度中的线程索引将不同


谢谢。

块中的线程以一致的方式映射到扭曲

在《CUDA编程指南》第4.1节中:

块划分为扭曲的方式始终相同;每个扭曲包含连续的、递增的线程ID,第一个扭曲包含线程0

在《CUDA编程指南》第2.2.1节中:

线程的索引及其线程ID以一种简单的方式相互关联:对于一维块,它们是相同的;对于尺寸为(Dx,Dy)的二维块,索引为(x,y)的螺纹的螺纹ID为(x+y Dx);对于尺寸为(Dx,Dy,Dz)的三维块,索引为(x,y,z)的线程的线程ID为(x+y Dx+z Dx Dy)

如果要在内核中的扭曲中选择单个线程,可以执行以下操作:

int id = threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y;
if (id % 32 == 0) {

    /* First thread of each warp is selected. */

}

块中的线程以一致的方式映射到扭曲

在《CUDA编程指南》第4.1节中:

块划分为扭曲的方式始终相同;每个扭曲包含连续的、递增的线程ID,第一个扭曲包含线程0

在《CUDA编程指南》第2.2.1节中:

线程的索引及其线程ID以一种简单的方式相互关联:对于一维块,它们是相同的;对于尺寸为(Dx,Dy)的二维块,索引为(x,y)的螺纹的螺纹ID为(x+y Dx);对于尺寸为(Dx,Dy,Dz)的三维块,索引为(x,y,z)的线程的线程ID为(x+y Dx+z Dx Dy)

如果要在内核中的扭曲中选择单个线程,可以执行以下操作:

int id = threadIdx.x + threadIdx.y * blockDim.x + threadIdx.z * blockDim.x * blockDim.y;
if (id % 32 == 0) {

    /* First thread of each warp is selected. */

}