【问题标题】:Do warp vote functions synchronize threads in the warp?经线投票功能是否同步经线中的线程?
【发布时间】:2013-10-19 05:58:02
【问题描述】:

CUDA warp vote 函数,例如 __any() 和 __all(),是否会同步 warp 中的线程?

换句话说,是否保证warp中的所有线程都执行warp vote函数之前的指令,尤其是操纵谓词的指令?

【问题讨论】:

    标签: cuda gpgpu


    【解决方案1】:

    同步是隐式的,因为 warp 中的线程以锁步方式执行。 [*]

    依赖此行为的代码称为“warp 同步”。

    [*] 如果您认为条件代码会导致 warp 中的线程遵循不同的执行路径,那么您需要了解更多关于 CUDA 硬件如何工作的信息。发散的条件代码(即条件对某些线程为真但对其他线程不成立的条件代码)会导致 warp 中的某些线程被禁用(通过预测或分支同步堆栈),但每个线程仍然占据经线中可用的 32 条车道之一。

    【讨论】:

      【解决方案2】:

      他们没有。您可以在代码分支中使用扭曲投票功能。如果它们在这种情况下同步,则可能会出现死锁。来自 PTX ISA:

      投票

      跨线程组投票。 语法

       vote.mode.pred  d, {!}a;
       vote.ballot.b32 d, {!}a;  // 'ballot' form, returns bitmask
      
       .mode = { .all, .any, .uni };
      

      说明

      跨线程中的线程执行源谓词的缩减。目的地 > 谓词值在 warp 中的所有线程中都是相同的。 减少模式有:

      .all 如果源谓词对于 warp 中的所有活动线程为 True,则为 True。否定源谓词以计算 .none。

      .任何 如果源谓词对于 warp 中的某些活动线程为 True,则为 True。否定源谓词以计算 .not_all。

      .uni 如果源谓词在 warp 中的所有活动线程中具有相同的值,则为真。否定源谓词也会计算 .uni。

      在投票表单中,vote.ballot.b32 只是简单地将 predicate 从一个 warp 中的每个线程复制到目标寄存器 d 的相应位位置,其中位位置对应于线程的通道 id。

      编辑: 由于 warp 中的线程是隐式同步的,因此您不必在投票发生时手动确保线程正确同步。请注意,对于 __all,只有活动线程参与投票。活动线程是在条件为真时执行指令的线程。这就解释了为什么会在代码分支中进行投票。

      【讨论】:

      • 这个接受的答案不准确。经线内的同步是隐式的。
      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多