CUDA CC3.x的保证:
即当条件分支(if
,switch
,......)的分支发生执行分歧时,前半个Warp的线程会转到一个分支,并执行下半部分的线程-Warp转到另一个分支 - 同时在一个时刻,如果它们都来自同一个Warp?
或者第二个半Warp线程将处于非活动状态(禁用)并将等待完成第一个半Warp(第一个分支),然后对于第二个分支是相反的 - 交换,前半个Warp将是禁用并等待第二个半Warp(第二个分支)的完成,即使分歧恰好发生在整个半Warp(正好是16个线程)?
if(threadId.x < 16) { branch_1(); }
else { branch_2(); }
如上所述:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capability-3-0
然后,在每个指令发布时,每个调度程序发出两个 独立指令,用于其已准备好的一个已分配的warp 执行,如果有的话。
这是否意味着它可以是来自不同分支(1和2)的两个独立指令用于每个半Warp,或者它只意味着它可以是两个独立指令连续地位于整个Warp的单个分支中?
答案 0 :(得分:4)
then
路径的线程和满足else
路径的线程。所有线程都开始执行两个路径中的一个,但是不满足该路径的线程保持空闲(不执行任何操作。)当该路径的执行完成时,warp从另一个路径重启,并且(之前空闲) )线程现在将执行剩余的路径,而(先前活动的)线程保持空闲。这是对不同控制流情况中行为的一般描述,它大致与您以Or the second half-Warp threads will be inactive(disabled) ...
开头的段落对齐,但我不会使用术语half-Warp
来描述它,因为这通常意味着关于cc1.x设备的事情。then
或else
而不是两者)。