CUDA warp vote函数,例如__ any()和__ all(),在warp中同步线程吗?
换句话说,是否保证warp中的所有线程都执行warp vote函数之前的指令,尤其是操作谓词的指令?
答案 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,只有活动线程参与投票。活动线程是执行条件为真的指令的线程。这解释了为什么在代码分支内可以进行投票。