如何理解" warp中的所有线程同时执行相同的指令。"在GPU?

时间:2016-12-07 05:08:11

标签: cuda gpu nvidia gpu-programming multiple-gpu

我正在阅读Professional CUDA C Programming,以及 GPU架构概述部分:

  

CUDA采用单指令多线程(SIMT)架构来管理和执行32个被称为warp的组中的线程。 warp中的所有线程同时执行相同的指令。每个线程都有自己的指令地址计数器和寄存器状态,并对自己的数据执行当前指令。每个SM将分配给它的线程块分区为32线程warp,然后调度它以便在可用的硬件资源上执行。

     

SIMT架构类似于SIMD(单指令,多数据)架构。 SIMD和SIMT都通过向多个执行单元广播相同的指令来实现并行性。一个关键的区别是SIMD要求向量中的所有向量元素在一个统一的同步组中一起执行,而SIMT允许同一warp中的多个线程独立执行。即使warp中的所有线程在同一程序地址处一起启动,单个线程也可能具有不同的行为。 SIMT使您能够为独立的标量线程编写线程级并行代码,以及为协调线程编写数据并行代码。 SIMT模型包括SIMD没有的三个关键功能:
  ➤每个线程都有自己的指令地址计数器   ➤每个线程都有自己的寄存器状态   ➤每个线程都可以有一个独立的执行路径。

第一段提及" All threads in a warp execute the same instruction at the same time.",而在第二段中,它表示" Even though all threads in a warp start together at the same program address, it is possible for individual threads to have different behavior."。这让我感到困惑,上述陈述似乎是矛盾的。任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:6)

没有矛盾。 warp中的所有线程始终以锁定步骤执行相同的指令。为了支持条件执行和分支,CUDA在SIMT模型中引入了两个概念

  1. 预测执行(见here
  2. 指令重播/序列化(参见here
  3. 预测执行意味着条件指令的结果可用于屏蔽线程执行没有分支的后续指令。指令重放是如何处理经典条件分支。所有线程通过重放指令来执行有条件执行的代码的所有分支。不遵循特定执行路径的线程被屏蔽掉并执行相当于NOP的操作。这就是CUDA中所谓的分支差异惩罚,因为它对绩效产生了重大影响。

    这就是锁步执行可以支持分支的方式。