【问题标题】:CUDA: Selecting one thread per warpCUDA:每个经线选择一个线程
【发布时间】:2020-03-31 12:08:51
【问题描述】:

我只想为每个 warp 选择一个线程进行一些操作。

例如,让我们从(64, 1, 1) 的一维块暗度开始。据我了解,考虑到经纱大小为 32,这将导致两个经纱。在这种情况下,我可以使用以下代码访问每个经纱一个线程:

if(threadIdx.x % 32 == 0) { ... }

首先,这是否有意义,因为我不确定我们是否知道线程是如何映射到硬件上的 warp 的?

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

谢谢。

【问题讨论】:

    标签: cuda


    【解决方案1】:

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

    在 CUDA 编程指南的第 4.1 节中:

    一个块被分割成warp的方式总是一样的;每个 warp 包含连续的线程,增加线程 ID,第一个 warp 包含线程 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)。

    如果您想在内核中的一个 warp 中选择一个线程,您可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 2011-02-09
      • 2011-12-31
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多