warp vote函数是否同步warp中的线程?

时间:2013-10-18 03:49:32

标签: cuda gpgpu

CUDA warp vote函数,例如__ any()和__ all(),在warp中同步线程吗?

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

2 个答案:

答案 0 :(得分:2)

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

依赖于此行为的代码称为“warp synchronous”。

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

答案 1 :(得分:0)

他们没有。您可以在代码分支中使用warp vote函数。如果他们在这种情况下同步,则可能会出现死锁。来自PTX ISA:

  

<强>表决

     

跨线程组投票。   语法

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

 .mode = { .all, .any, .uni };
  

<强>描述

     

在warp中的线程之间执行源谓词的减少。目的地&gt; warp中所有线程的谓词值都相同。   减少模式是:

     

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

     

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

     

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

     

在选票形式中,vote.ballot.b32只是将warp中每个线程的谓词复制到目标寄存器d的相应位位置,其中位位置对应于线程的通道ID。

修改 由于warp中的线程是隐式同步的,因此必须手动确保在投票时线程正确同步。请注意,对于__all,只有活动线程参与投票。活动线程是执行条件为真的指令的线程。这解释了为什么在代码分支内可以进行投票。