【发布时间】:2014-02-11 02:32:15
【问题描述】:
对 CUDA CC3.x 有什么保证:
- 一个 Warp 的所有线程总是同步的?
- 一个Half-Warp(但不是整个Warp)的所有线程总是同步的?
即当条件分支(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,它可以是连续位于单个分支中的两条独立指令?
【问题讨论】:
-
抽象的 CUDA 执行模型中没有半扭曲这样的东西。在早期的硬件上,内存控制器设计每半个扭曲发出事务,但这与指令发散无关