CUDA/OpenCL 中的现实死锁示例

2023-12-24

对于我正在编写的教程,我正在寻找一个“现实”且简单的示例,说明由于不了解 SIMT / SIMD 而导致的死锁。

我想出了这个片段,这似乎是一个很好的例子。

任何意见将不胜感激。

…
int x = threadID / 2;
if (threadID > x) {
    value[threadID] = 42;
    barrier();
    }
else {
    value2[threadID/2] = 13
    barrier();
}
result = value[threadID/2] + value2[threadID/2];

我知道,它既不是正确的 CUDA C,也不是正确的 OpenCL C。


新手 CUDA 程序员实际上很容易捕获的一个简单死锁是,当尝试为单个线程实现关键部分时,该死锁最终应该由所有线程执行。它或多或少是这样的:

__global__ kernel() {
  __shared__ int semaphore;
  semaphore=0;
  __syncthreads();
  while (true) {
    int prev=atomicCAS(&semaphore,0,1);
    if (prev==0) {
      //critical section
      semaphore=0;
      break;
    }
  }
}

The atomicCAS指令确保精确的一个线程获得分配给 prev 的 0,而所有其他线程获得 1。当该线程完成其临界区时,它将信号量设置回 0,以便其他线程有机会进入临界区。

问题是,当 1 个线程获取 prev=0 时,属于同一 SIMD 单元的 31 个线程获取值 1。在 if 语句处,CUDA 调度程序将该单个线程置于保留状态(将其屏蔽),并让其他 31 个线程处于等待状态。 - 线程继续工作。在正常情况下,这是一个很好的策略,但在这种特殊情况下,您最终会得到 1 个从未执行的临界区线程和 31 个无限等待的线程。僵局。

另请注意,存在break这导致控制流外部while环形。如果省略break指令并在if块之后添加一些应该由所有线程执行的操作,它实际上可以帮助调度程序避免死锁。

关于问题中给出的示例:在 CUDA 中,明确禁止将__syncthreads()在 SIMD 发散代码中。编译器不会捕获它,但手册中提到了“未定义的行为”。实际上,在费米之前的设备上,所有__syncthreads()被视为相同的障碍。根据这个假设,您的代码实际上会终止而不会出现错误。一应该not不过依赖这种行为。

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

CUDA/OpenCL 中的现实死锁示例 的相关文章

随机推荐

  • 如果设置 $_SESSION 转到此页面?

    好吧 这里遇到麻烦了 我创建了一个登录脚本 因此在一个人登录后 他们将被定向到另一个页面 而且 如果他们尝试访问其他页面之一 我会将其重定向到登录页面 我的问题是 如果用户登录并再次偶然进入登录页面 我希望它能够识别用户已登录并将其重定向到
  • 创建新的 MVC 项目时出错 - EF 和 JQuery

    每当我创建新的 MVC 项目时 我都会收到错误 无法为实体框架和 Jquery 初始化 Powershell 主机 错误 无法从 C Program Files Microsoft ASP NET ASP NET MVC 4 Package
  • 如何让 Elmah 与 ASP.NET 和 IIS 5.1 URL 路由一起使用

    我在通过本地 IIS 5 1 Web 服务器运行 ASP NET MVC 应用程序时遇到问题 我相信这些问题与 IgnoreRoutes 有关 但我似乎无法制作 IgnoreRoute 来解决问题 Problem 我可以查看我的 elmah
  • Android:如何从 Android 应用程序获取 IP 地址?

    是否可以从 Android 应用程序获取 IP 地址 我将其在书签中保存了一段时间 但从未测试过 http www droidnova com get the ip address of your device 304 html http
  • 如何对 input() 函数中显示的文本应用着色/格式(类似于 print 语句格式)?

    我有一个小型游戏应用程序 它是从 Windows 控制台 cmd exe 启动的 我可以使用 ANSI 转义序列以任何所需的方式格式化文本 我也想对文本应用格式input 方法 但我还没有找到如何做到这一点的方法 这是测试代码 from c
  • SQL Server 的 timestamp2 在 JDBC 中如何工作?

    我在尝试在 SQL Server 2008 中使用 timestamp2 而不是 Timestamp 时遇到了一些麻烦 显然 rs getTimestamp 在 timestamp 和 timestamp2 之间有非常不同的行为 但是 我找
  • 文字轮播交叉淡入淡出效果?

    我们正在尝试实现一个简单的文本轮播 用几个其他单词替换句子中的单个单词 它们将淡入 淡出 容器宽度应缩小 放大以容纳新单词 听起来很简单 但我们遇到了困难 应该像第二行一样工作www branch com http www branch c
  • Google App Engine (Java) 上的全文搜索

    关于这个主题有一些线索 但我认为我的用例有些不同 我想做的事 我的 GAE J 应用程序的全文搜索组件 索引大小较小 25 50MB左右 我不需要实时更新索引 定期重新索引就可以了 这是为了自动完成等 所以它需要非常快 我的印象是在数据存储
  • 在 Servlet 中使用 org.json 会导致 java.lang.ClassNotFoundException: org.json.JSONException

    我正在尝试开发一个 servlet 来发送一些 JSON 对象 但遇到几个异常 我相信我需要添加一些 jar 文件 但我不确定是哪个 这是 doGet 方法以及我导入的所有内容 import java io IOException impo
  • 更改导航栏按钮项目的标题

    let button UIButton button setImage UIImage named coin icon forState UIControlState Normal button addTarget self action
  • 在 docker 容器外部公开日志文件

    我有 net core 应用程序 其中 Serilog 作为日志框架 现在 Serilog 正在记录到文件 我想将此文件公开在容器外部 并像其他文件一样进行简单的访问 我根据 docker compose 参考尝试使用volume和volu
  • 如何将我的电子表格链接到应用制作工具?

    我是 App Maker 的新用户 刚刚开始使用 Google App Scripts 进行编码 所以基本上我对这个主题了解不多 今天我正在开发一个已经存在于 Google Sheets 中的应用程序 我必须使用应用程序制作工具重新创建它
  • 了解操作系统如何存储/检索 IO 设备输入

    我对键盘等 I O 设备如何存储输入以供操作系统或应用程序使用感到有点困惑 如果我有一台单处理器 单核CPU 的计算机 并且当前正在执行的进程是一个游戏 那么游戏如何能够 感知 键盘输入 即使按下按键会强制硬件中断 从而实现上下文切换 然后
  • 在海岸线附近的 ggplot 中选择栅格

    所以我有一张绘制加泰罗尼亚气压的地图 这是一个特写 我现在想选择气压高于 97 kPa 深蓝色 的所有观测值 并用它们创建一个新的数据框以供进一步分析 这是棘手的一点 我想选择符合高度过滤器 AAAAND 的观测值 并且位于地中海沿岸 大多
  • “AspNetUser”类型上的“Claims”属性不是导航属性

    我正在使用 ASP NET Identity 2 2 我正在将 ASP NET 旧成员资格迁移到新的身份系统 我正在按照中提到的步骤进行操作本文 http www asp net identity overview migrations m
  • 如何使用 Google Relyparty 禁用用户 Firebase?

    我想从我的应用程序中禁用 Firebase 用户 但 Firebase 文档只提供了删除用户的选项 我认为解决方案就像创建用户一样 https www googleapis com identitytoolkit v3 relyingpar
  • 用于 bash 补全的“have”关键字

    Is havebash 中的关键字 或者 bash 补全脚本使用非 bash 的语言吗 have gcc gcc 是很常见 看 grep have etc bash completion d 我找不到有关我见过的 bash 完成教程的任何信
  • 如何在 R 中为数据框着色

    我有以下类型的数据框 gt df V1 V2 V3 V4 V5 1 10 603 3 100 2 1 5 1 2 10 603 3 101 3 2 4 5 3 10 603 3 102 1 3 3 2 4 10 603 1 103 4 4
  • .NET 中是否存在与 UI 无关的 Point 结构?

    我认识几个Point NET 中的结构 System Drawing Point System Windows Point Sys UI Point 但它们都位于高级 UI 库 GDI WPF AJAX 中 我需要一个Point我不想将其与
  • CUDA/OpenCL 中的现实死锁示例

    对于我正在编写的教程 我正在寻找一个 现实 且简单的示例 说明由于不了解 SIMT SIMD 而导致的死锁 我想出了这个片段 这似乎是一个很好的例子 任何意见将不胜感激 int x threadID 2 if threadID gt x v