Cuda 如何理解;扭曲中的所有线程同时执行同一条指令。”;在GPU中?

Cuda 如何理解;扭曲中的所有线程同时执行同一条指令。”;在GPU中?,cuda,nvidia,gpu,multiple-gpu,Cuda,Nvidia,Gpu,Multiple Gpu,我正在阅读GPU体系结构概述部分: CUDA采用单指令多线程(SIMT)体系结构来管理和执行32个被称为WARP的线程组。扭曲中的所有线程同时执行同一条指令。每个线程都有自己的指令地址计数器和寄存器状态,并对自己的数据执行当前指令。每个SM将分配给它的线程块划分为32个线程扭曲,然后安排在可用硬件资源上执行 SIMT体系结构类似于SIMD(单指令多数据)体系结构。SIMD和SIMT都通过向多个执行单元广播相同的指令来实现并行性。关键区别在于SIMD要求向量中的所有向量元素在统一的同步组中一起执行

我正在阅读GPU体系结构概述部分:

CUDA采用单指令多线程(SIMT)体系结构来管理和执行32个被称为WARP的线程组。扭曲中的所有线程同时执行同一条指令。每个线程都有自己的指令地址计数器和寄存器状态,并对自己的数据执行当前指令。每个SM将分配给它的线程块划分为32个线程扭曲,然后安排在可用硬件资源上执行

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


第一段提到“
一个warp中的所有线程同时执行同一条指令。
”,而第二段提到“
即使一个warp中的所有线程在同一个程序地址一起启动,单个线程也可能有不同的行为。
”。这让我感到困惑,而上述说法似乎自相矛盾。谁能解释一下吗?

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

  • 谓词执行(请参阅)
  • 指令重放/序列化(请参阅)
  • 谓词执行意味着可以使用条件指令的结果来屏蔽线程,使其不执行没有分支的后续指令。指令重放是如何处理经典条件分支的。所有线程通过重放指令来执行有条件执行的代码的所有分支。不遵循特定执行路径的线程被屏蔽,并执行与NOP等效的操作。这就是CUDA中所谓的分支发散惩罚,因为它对性能有重大影响


    这就是锁步执行如何支持分支。

    我可以知道在这两种情况下被屏蔽的线程之间是否有显著的区别吗?《编程指南》说,“带有假谓词的指令不会写入结果,也不会计算地址或读取操作数”。这和NOP有很大不同吗?另外,对于第二种情况,我不确定在哪个阶段重播哪些指令。谢谢。如果“一个warp中的所有线程同时执行同一条指令”,为什么“每个线程都有自己的指令地址计数器”?1 warp中的所有线程都可以共享1指令地址计数器吗?@Thomson:因为谓词和指令重放需要线程级状态才能工作。线程共享一个扭曲级指令计数器,它们需要自己相对于该扭曲级指令计数器的状态。