对CUDA CC3.x有什么保证 - 一个Warp或只有一半Warp的所有线程总是同步的?

时间:2014-01-21 13:11:01

标签: cuda gpgpu nvidia

CUDA CC3.x的保证:

  • 一个Warp的所有线程总是同步?
  • 一个Half-Warp(但不是整个Warp)的所有线程总是同步的?

即当条件分支(ifswitch,......)的分支发生执行分歧时,前半个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的单个分支中?

1 个答案:

答案 0 :(得分:4)

  1. 半翘曲的概念仅适用于cc1.x的设备。也许 你只是指经线的一部分。
  2. 事实上,在CUDA编程模型中无法保证warp的线程将以锁步方式执行。但是现在所有现有的实现都是这样做的,因此有相当多的代码库可以利用warp-synchronous行为。
  3. 一旦进入可能不同的控制结构(例如if-then-else),将对warp中的所有线程执行条件测试。如有必要,然后将warp分区为满足then路径的线程和满足else路径的线程。所有线程都开始执行两个路径中的一个,但是不满足该路径的线程保持空闲(不执行任何操作。)当该路径的执行完成时,warp从另一个路径重启,并且(之前空闲) )线程现在将执行剩余的路径,而(先前活动的)线程保持空闲。这是对不同控制流情况中行为的一般描述,它大致与您以Or the second half-Warp threads will be inactive(disabled) ...开头的段落对齐,但我不会使用术语half-Warp来描述它,因为这通常意味着关于cc1.x设备的事情。
  4. 对于能够发出多指令问题的设备,发给warp的指令将来自当前正在执行的路径(thenelse而不是两者)。