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. */
}