【问题标题】:How to understand "All threads in a warp execute the same instruction at the same time." in GPU?如何理解“warp 中的所有线程同时执行相同的指令”。在 GPU 中?
【发布时间】:2016-12-07 05:08:11
【问题描述】:

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

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

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.”。这让我很困惑,上面的陈述似乎相互矛盾。谁能解释一下?

【问题讨论】:

    标签: cuda nvidia gpu multiple-gpu


    【解决方案1】:

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

    1. 预测执行(见here
    2. 指令回放/序列化(参见here

    谓词执行意味着条件指令的结果可用于屏蔽线程,使其不执行没有分支的后续指令。指令重放是处理经典条件分支的方式。所有线程通过重播指令来执行条件执行代码的所有分支。不遵循特定执行路径的线程被屏蔽并执行相当于 NOP。这就是 CUDA 中所谓的分支发散惩罚,因为它对性能有很大的影响。

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

    【讨论】:

    • 我可以知道在这两种情况下被屏蔽的线程之间是否有任何显着差异?编程指南说“带有错误谓词的指令不会写入结果,也不会评估地址或读取操作数”。这与 NOP 有很大不同吗?此外,对于第二种情况,我不确定在哪个阶段重播了哪些指令。谢谢。
    • 如果“warp 中的所有线程同时执行同一条指令”,为什么“每个线程都有自己的指令地址计数器”? 1 个 warp 中的所有线程可以共享 1 个指令地址计数器吗?
    • @Thomson:因为预测和指令重放需要线程级状态才能工作。线程共享确实共享一个 warp 级指令计数器,并且它们需要相对于该 warp 级指令计数器的自己的状态。
    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多