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

Nan Xiao

我正在阅读《专业CUDA C编程》,并且在《GPU体系结构概述》部分中:

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

SIMT体系结构类似于SIMD(单指令多数据)体系结构。SIMD和SIMT都通过将同一条指令广播到多个执行单元来实现并行性。一个关键的区别是SIMD要求向量中的所有向量元素必须在未分配的同步组中一起执行,而SIMT允许同一线程束中的多个线程独立执行。即使扭曲中的所有线程都从同一程序地址一起开始,但各个线程可能具有不同的行为。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在SIMT模型中引入了两个概念

  1. 谓词执行(请参阅此处
  2. 指令重播/序列化(请参阅此处

预定执行意味着条件指令的结果可用于屏蔽线程,使其无需分支即可执行后续指令。指令重播是如何处理经典的条件分支。所有线程都通过重播指令来执行条件执行代码的所有分支。不遵循特定执行路径的线程将被屏蔽并执行与NOP等效的操作。这是CUDA中所谓的分支分歧惩罚,因为它会对性能产生重大影响。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

所有线程是否真的同时运行同一程序?

来自分类Dev

如何确保在同一函数终止之前在函数中创建的所有线程都返回?

来自分类Dev

Java 线程:如何同时执行一条语句

来自分类Dev

可以在Java中执行第一条指令之前由调度程序挂起线程吗?

来自分类Dev

Delphi并非所有线程同时执行

来自分类Dev

如何获取线程中的最后一条消息?

来自分类Dev

如何等待方法中创建的所有线程

来自分类Dev

gdb两次执行同一条语句

来自分类Dev

当所有线程完成执行后,如何运行我的最后一个线程?

来自分类Dev

如何实现规则如果我只想执行一条规则而不是在Drools Rule Engine中执行所有规则?

来自分类Dev

如何实现规则如果我只想执行一条规则而不是在Drools Rule Engine中执行所有规则?

来自分类Dev

如何只从画布中删除一条线,而不是所有图形?

来自分类Dev

如何通过一条语句描述数据库中的所有表?

来自分类Dev

如何通过一条语句描述数据库中的所有表?

来自分类Dev

如何仅从画布中删除一条线,而不是所有图形?

来自分类Dev

Jmeter:如何一次初始化映射并为线程组中的所有线程共享它

来自分类Dev

Quantstrat:如何在同一条上执行?

来自分类Dev

如何在不同的线程中运行同一类的不同方法?

来自分类Dev

锁定除python中的所有线程外的所有线程

来自分类Dev

我如何将一条捕获的所有路线设置为Laravel中的最后一条路线

来自分类Dev

如何确保我没有从多个流程中更新同一条记录?我需要桌锁吗?

来自分类Dev

如何使图像和 div 从有序列表 CSS 中的同一条水平线开始?

来自分类Dev

使一条线的价格成为所有线的价格

来自分类Dev

如何在Oracle中多次(并行)执行同一作业?

来自分类Dev

如何以最少的DRY漂亮方式执行同一目录中的许多文件?

来自分类Dev

如何在Testlink配置副中多次执行同一测试用例

来自分类Dev

跳过 mips32 中的下一条指令

来自分类Dev

如何在一条指令中的几列上添加NOT NULL约束

来自分类Dev

如何在Xcode 6.1.1上的GNU汇编器中重复一条指令?

Related 相关文章

  1. 1

    所有线程是否真的同时运行同一程序?

  2. 2

    如何确保在同一函数终止之前在函数中创建的所有线程都返回?

  3. 3

    Java 线程:如何同时执行一条语句

  4. 4

    可以在Java中执行第一条指令之前由调度程序挂起线程吗?

  5. 5

    Delphi并非所有线程同时执行

  6. 6

    如何获取线程中的最后一条消息?

  7. 7

    如何等待方法中创建的所有线程

  8. 8

    gdb两次执行同一条语句

  9. 9

    当所有线程完成执行后,如何运行我的最后一个线程?

  10. 10

    如何实现规则如果我只想执行一条规则而不是在Drools Rule Engine中执行所有规则?

  11. 11

    如何实现规则如果我只想执行一条规则而不是在Drools Rule Engine中执行所有规则?

  12. 12

    如何只从画布中删除一条线,而不是所有图形?

  13. 13

    如何通过一条语句描述数据库中的所有表?

  14. 14

    如何通过一条语句描述数据库中的所有表?

  15. 15

    如何仅从画布中删除一条线,而不是所有图形?

  16. 16

    Jmeter:如何一次初始化映射并为线程组中的所有线程共享它

  17. 17

    Quantstrat:如何在同一条上执行?

  18. 18

    如何在不同的线程中运行同一类的不同方法?

  19. 19

    锁定除python中的所有线程外的所有线程

  20. 20

    我如何将一条捕获的所有路线设置为Laravel中的最后一条路线

  21. 21

    如何确保我没有从多个流程中更新同一条记录?我需要桌锁吗?

  22. 22

    如何使图像和 div 从有序列表 CSS 中的同一条水平线开始?

  23. 23

    使一条线的价格成为所有线的价格

  24. 24

    如何在Oracle中多次(并行)执行同一作业?

  25. 25

    如何以最少的DRY漂亮方式执行同一目录中的许多文件?

  26. 26

    如何在Testlink配置副中多次执行同一测试用例

  27. 27

    跳过 mips32 中的下一条指令

  28. 28

    如何在一条指令中的几列上添加NOT NULL约束

  29. 29

    如何在Xcode 6.1.1上的GNU汇编器中重复一条指令?

热门标签

归档