【问题标题】:What guarantees for CUDA CC3.x - all threads of one Warp or only of half-Warp always synchronized?对 CUDA CC3.x 有什么保证 - 一个 Warp 或仅半 Warp 的所有线程始终同步?
【发布时间】:2014-02-11 02:32:15
【问题描述】:

对 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,它可以是连续位于单个分支中的两条独立指令?

【问题讨论】:

  • 抽象的 CUDA 执行模型中没有半扭曲这样的东西。在早期的硬件上,内存控制器设计每半个扭曲发出事务,但这与指令发散无关

标签: cuda gpgpu nvidia


【解决方案1】:
  1. half-warp 的概念仅适用于 cc1.x 的设备。可能 您只是指经线的一部分。
  2. 事实上,在 CUDA 编程模型中并不能保证 warp 的线程将在锁步中执行。然而,目前所有现存的实现都是这样做的,因此有相当多的代码库可以利用 warp 同步行为。
  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 不是两者)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2020-01-02
    • 2017-05-27
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多