Cuda 扭曲投票函数是否同步扭曲中的线程?

Cuda 扭曲投票函数是否同步扭曲中的线程?,cuda,gpgpu,Cuda,Gpgpu,CUDA warp投票函数(如_any()和_all())是否同步warp中的线程 换句话说,是否可以保证warp中的所有线程执行warp投票函数之前的指令,特别是操作谓词的指令?它们不执行。您可以在代码分支中使用扭曲投票函数。如果它们在这种情况下进行同步,可能会出现死锁。从PTX ISA: 投票 跨线程组投票。 语法 说明 在扭曲中跨线程执行源谓词的缩减。目标>谓词值在扭曲中的所有线程中都相同。 还原模式为: .全部 如果warp中所有活动线程的源谓词均为True,则为True。求反要计算的源

CUDA warp投票函数(如_any()和_all())是否同步warp中的线程


换句话说,是否可以保证warp中的所有线程执行warp投票函数之前的指令,特别是操作谓词的指令?

它们不执行。您可以在代码分支中使用扭曲投票函数。如果它们在这种情况下进行同步,可能会出现死锁。从PTX ISA:

投票

跨线程组投票。 语法

说明

在扭曲中跨线程执行源谓词的缩减。目标>谓词值在扭曲中的所有线程中都相同。 还原模式为:

.全部 如果warp中所有活动线程的源谓词均为True,则为True。求反要计算的源谓词。无

.任何 如果warp中某个活动线程的源谓词为True,则为True。求反要计算的源谓词。不是全部

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

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

编辑:
由于扭曲中的线程是隐式同步的,无需手动确保投票时线程正确同步。请注意,对于_,只有所有活动线程参与投票。活动线程是在条件为真时执行指令的线程。这解释了为什么投票可以发生在代码分支中。

同步是隐式的,因为warp中的线程是在lockstep中执行的。[*]

依赖此行为的代码称为“扭曲同步”


[*]如果您认为条件代码会导致扭曲中的线程遵循不同的执行路径,那么您需要了解更多有关CUDA硬件如何工作的信息。发散条件代码(即条件代码,其中某些线程的条件为真,而其他线程的条件为假)导致扭曲中的某些线程被禁用(通过谓词或分支同步堆栈),但每个线程仍占用扭曲中可用的32条通道中的一条。

此公认答案不准确。扭曲内的同步是隐式的。
 vote.mode.pred  d, {!}a;
 vote.ballot.b32 d, {!}a;  // 'ballot' form, returns bitmask

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