CUDA:避免分支发散时的串行执行

2023-12-04

假设由单个 warp 执行的 CUDA 内核(为简单起见)达到if-else语句,其中经纱内的 20 个线程满足condition而 32 - 20 = 12 线程则不会:

if (condition){
    statement1;     // executed by 20 threads
else{
    statement2;     // executed by 12 threads
}

根据CUDA C 编程指南:

warp 一次执行一条公共指令 [...] 如果 warp 的线程通过数据相关的条件分支发散,则 warp 串行执行所采用的每个分支路径,禁用不在该路径上的线程,并且当所有路径完成后,线程会聚回相同的执行路径。

因此,这两个语句将在单独的周期中顺序执行。

Kepler 架构的每个 warp 调度器包含 2 个指令调度单元,因此能够在每个周期为每个 warp 发出 2 个独立指令。

我的问题是:在这种只有两个分支的情况下,为什么可以statement1 and statement2不由两个指令调度单元发出以供warp内的32个线程同时执行,即20个线程执行statement1而另外 12 个同时执行statement2?如果指令调度程序不是 warp 一次执行一条公共指令的原因,那么是什么?是只提供32线程宽指令的指令集吗?还是硬件相关的原因?


每条内核指令始终针对扭曲中的所有线程执行。因此,逻辑上不可能同时在同一个线程束内的不同线程上执行不同的指令。这将违背SIMT执行模型GPU 是基于它构建的。对于你的问题:

Kepler 架构的每个 warp 调度器包含 2 个指令调度单元,因此能够在每个周期为每个 warp 发出 2 个独立指令。

...

为什么statement1和statement2不能由两个指令调度单元发出以供warp内的32个线程同时执行,即20个线程执行statement1,而另外12个线程同时执行statement2?

我不确定你是否意识到这一点,但如果statement1 and statement2计算上是独立的,那么它们可以在一个周期内执行:

  1. 指示来自statement1将在所有线程上执行,
  2. 指示来自statement2由于第二个调度单元,将在调度时的同一周期内对所有线程执行。

这就是 GPU 中分支分歧的一般工作原理,可以找到一些进一步的阅读,例如here。因此,我相信您已经免费得到了您想要的东西 - 两个语句都在同一个周期内执行(或can be).

EDIT:

正如talonmies在评论中所述,可能值得一提的是条件执行,因为它有时有助于防止分支分歧造成的惩罚。有关此主题的更多信息,请参见:在这个所以线程,引用:

对于更简单的条件,NVIDIA GPU 支持 ALU 处的条件评估,这不会导致发散,并且对于整个扭曲遵循相同路径的条件,显然也没有惩罚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA:避免分支发散时的串行执行 的相关文章

随机推荐

  • python绘制多个直方图

    我有一个包含 30 个变量的数据框 X v1 v2 v30 and col name v1 v2 v30 对于每个变量 我想绘制直方图以了解变量分布 但是 写代码逐一绘制太手动了 我可以用for循环之类的东西一次性绘制30个直方图吗 例如
  • Python 3.1.3 打开 mbox 文件,与 python 2.x 相比真的慢吗?

    我尝试在 python 3 1 3 中使用邮箱模块打开 mbox 文件 里面只有3封邮件 只有27k大 但是 当阅读邮件时 我的 CPU 使用 100 大约 2 3 分钟 直到它完成任务且没有错误 我用 python 2 7 1 尝试了同样
  • 在 Android 上实时更改曲目的播放速率

    我想知道是否有人知道一个可以实时更改曲目播放速率的库 我的想法是加载曲目并将其播放速率更改为一半或两倍 首先 我尝试使用 MusicPlayer 但根本不可能 然后我尝试使用 SoundPool 问题是 使用 SoundPool 一旦加载曲
  • 如何复制包含“\0”字符的数据

    我正在尝试复制包含 0 的数据 我正在使用 C 当研究结果是否定的时 我决定编写自己的函数来将数据从一个 char 复制到另一个 char 但它没有返回想要的结果 我的尝试如下 include
  • Laravel 急切加载与嵌套关系

    我知道有人问过这个问题 但我的情况有所不同 我定义了与评论模型关系的帖子模型 Post Model public function comments return this gt hasMany comment 和评论模型 每个评论属于一个
  • 在Python中查找列表中最长和最短的列表[重复]

    这个问题在这里已经有答案了 我需要打印列表中具有最小和最大项目数的列表 例如 如果我有 total list 1 2 3 1 2 3 4 1 2 3 4 5 我需要返回具有最小和最大长度的列表 我该怎么做 输出可能类似于 total lis
  • WndProc 中未捕获表单 WM_KEYDOWN 和 WM_KEYUP 消息

    不捕获表单 keydown 和 keyup 消息 public partial class Form1 Form const int WM KEYDOWN 0x100 const int WM KEYUP 0x101 protected o
  • Firestore:查询与搜索词匹配或相似的名称

    我有一个用户列表 其姓名位于 Firestore 数据库中 我想要实现的是让用户能够搜索和找到其他用户 我的问题是 Query query db collection users whereEqualTo name searchTerm F
  • 检查电池电量 iOS Swift [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我刚刚开始使用 Swift 一直在寻找一种检查电池电量的方法 我发现这个资源并一直在尝试它 但由于某种原因似乎无法让它工作 我不太确定如何解决这个问题 有任何想法吗 Xcode 11 Sw
  • 无法实例化活动 - android studio

    我正在 android studio 中制作一个应用程序 当启动我的一项活动时 应用程序崩溃并说它无法实例化该活动 我检查了清单文件 活动名称带有红色下划线 上面写着 X 不是具体类 验证 Android XML 文件中的资源 任何帮助将不
  • 空手道:如何使用 sudo 实现 Linux 使用的 --no-sandbox 标头

    我想在 jenkins 中为 UI 测试自动化设置一个无头 chrome 驱动程序 但要运行测试命令 sudo E java jar karate 0 9 3 jar karate GUI feature 我必须以 root 身份运行 并且
  • Twitter API 获取推文 - 返回 CORS 来源被阻止

    我正在尝试从主题标签获取推文 我收到以下错误 跨源请求被阻止 同源策略不允许读取远程资源 https api twitter com oauth2 token 原因 CORS 标头 Access Control Allow Origin 丢
  • 是否可以使用 Mali OpenCL SDK 在 ARM CPU (Cortex-a7) 上执行 OpenCL 代码?

    Mali OpenCL SDK 允许在 Mali GPU 上执行 opencl 代码 是否可以使用 Mali OpenCL SDK 在 ARM CPU Cortex a7 上执行 OpenCL 代码 目前还没有 ARM 仅公开发布了在 Ma
  • 使用自定义类访问 OLEObject 事件

    我正在尝试在 Excel VBA 中创建一个自定义类来处理 OLEObject 工作表上的 ActiveX 控件 的 GotFocus 和 LostFocus 事件 定制类clsSheetControl Dim WithEvents obj
  • ASP MVC 编译时包含部分视图

    我有两个不同的视图 每个视图对一个公共部分视图进行超过 500 次局部视图调用 良好的设计告诉我 我应该将部分视图保留在原处 并从两个重叠的视图中引用它 以防止代码重复 不幸的是 性能受到影响 将部分视图复制粘贴到其他两个视图中会产生 30
  • Outlook 对象模型 - 检测电子邮件是否已发送

    我的测试 Delphi 2006 BDS 应用程序中有以下代码 procedure TForm1 Button1Click Sender TObject const olMailItem 0 var Outlook OleVariant v
  • cloudsim中的分时在cloudsim中如何工作?

    cloudsim中的分时是如何工作的 没有代表时间片或量子的变量 那么round robin的概念在cloudsim中是如何验证的呢 如果我们有 50 个 cloudlet 10 个虚拟机 其实CloudletSchedulerTimeSh
  • WebForm_DoPostBackWithOptions 未定义

    我下载并设置了 MS 的 Stock Trader 应用程序 我正在运行 Vista Ultimate IIS7 VS 2008 NET 3 5 整个应用程序大约有 120 MB 所以相当复杂 但一切似乎都通过 msi 设置得很好 当我运行
  • 如何在单个 iOS 应用程序中使用多个 Facebook 应用程序 ID?

    我想要一个 iOS 应用程序在运行时在多个 Facebook 应用程序之间切换 我希望用户能够在不同的 Facebook 应用程序 ID 下登录和发帖 具体取决于他们使用的是 iOS 应用程序的哪个部分 Facebook iOS SDK 从
  • CUDA:避免分支发散时的串行执行

    假设由单个 warp 执行的 CUDA 内核 为简单起见 达到if else语句 其中经纱内的 20 个线程满足condition而 32 20 12 线程则不会 if condition statement1 executed by 20