GPU 上非原子写入的保证很弱吗?

2024-03-21

OpenCL 和 CUDA 包含原子操作已有好几年了(尽管显然并非每个 CUDA 或 OpenCL 设备都支持这些操作)。但是 - 我的问题是关于由于非原子写入而“共存”种族的可能性。

假设网格中的多个线程都写入全局内存中的同一位置。我们是否可以保证,当内核执行结束时,这些写入之一的结果将出现在该位置,而不是一些垃圾?

此问题的相关参数(选择任意组合,edit除了 nVIDIA+CUDA 已经得到答案):

  • 内存空间:全局内存only;这个问题与本地/共享/私有内存无关。
  • 对齐:在单个内存写入宽度内(例如 nVIDIA GPU 上的 128 位)
  • GPU 制造商:AMD/nVIDIA
  • 编程框架:CUDA/OpenCL
  • 存储指令在代码中的位置:所有线程的同一行代码/不同的代码行。
  • 写入目的地:固定地址/距函数参数地址的固定偏移量/完全动态
  • 写入宽度:8 / 32 / 64 位。

我们是否可以保证,当内核执行结束时,这些写入之一的结果将出现在该位置,而不是一些垃圾?

对于当前的 CUDA GPU,我非常确定对于采用 OpenCL 的 NVIDIA GPU,答案是肯定的。我下面的大部分术语都会考虑到 CUDA。如果您需要 CUDA 和 OpenCL 的详尽答案,请告诉我,我将删除此答案。与此非常相似的问题 https://stackoverflow.com/questions/22151070/cuda-non-atomic-write-clash-results/22151276#22151276无论如何,之前已经被问过并回答过。这是另一个 https://stackoverflow.com/questions/20775033/are-general-reads-and-writes-to-global-memory-atomic-in-cuda-if/20775278#20775278,而且我确信还有其他人。

当同一位置发生多个“同时”写入时,其中一个将完好无损地获胜。

哪一方会获胜尚无定论。非获胜写入的行为也是未定义的(它们可能发生,但被获胜者取代,或者它们可能根本不发生。)内存位置的实际内容可能会通过各种值(例如原始值)进行转换,加上任何有效的写入值),但传输不会传递“垃圾”值(即不存在且未由任何线程写入的值。)传输最终以“获胜者”结束。

示例1:

位置 X 包含零。线程 1、5、32、30000 和 450000 都向该位置写入 1。如果该位置没有其他写入流量,则该位置最终将包含值 1(在内核终止时或更早)。

示例2:

位置 X 包含 5。线程 32 将 1 写入 X。线程 90303 将 7 写入 X。线程 432322 将 972 写入 X。如果没有其他写入流量到该位置,则在内核终止时或更早,位置 X 将包含 1 、7 或 972。它不会包含任何其他值,包括 5。

我假设 X 位于全局内存中,并且到它的所有流量自然地与它对齐,并且到它的所有流量具有相同的大小,尽管这些原则也适用于共享内存。我还假设您没有违反 CUDA 编程原则,例如自然排列的交通 http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory-accesses到设备内存位置。我在这里看到的事务是源自单个 SASS 指令(每个线程)的事务。此类事务的宽度可以为 1、2、4 或 8 字节。无论写入是源自“同一行代码”还是“不同行”,我在这里所做的声明都适用。

这些声明基于 PTX 内存一致性模型,因此“正确性”是由 GPU 硬件保证的,而不是由编译器、CUDA 编程模型或 CUDA 所基于的 C++ 标准来保证。

这是一个相当复杂的主题(特别是当我们考虑缓存行为,以及当我们将读取混合在一起时会发生什么),但是“垃圾”值应该never发生。全局内存中应该出现的唯一值是那些一开始就存在的值,或者是由某个线程在某处写入的那些值。

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

GPU 上非原子写入的保证很弱吗? 的相关文章

随机推荐

  • 与 React 一起使用时如何检测 keyPress 上的“Enter”键

    我正在使用 ReactJs 来开发我的应用程序 我试图通过处理 onKeyPress 事件在按下 Enter 时提交输入文本 它检测其他输入 但不输入 我尝试过不同的方法 event key event charCode event key
  • Cassandra RandomPartitioner 版本 1.2.3

    我使用 apt 在 debian 上安装 Cassandra 1 2 3 我之前使用的是 tarball 1 1 7 安装 安装后 我将 cassandra yaml 中的分区器从 Murmur3Partitioner 更改为 Random
  • Expo.FileSystem.downloadAsync 不显示下载通知

    我正在使用世博会FileSystem下载 pdf 文件 API 响应进入 success 函数 但是 我无法向用户显示下载的文件 预期的行为应该就像我们通常在状态栏上看到通知图标一样 单击图标会打开您的文件 FileSystem downl
  • DNS 服务器管理的域列表[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我们有一台运行 Ensim 的服务器 这是一个类似 Plesk 的旧工具 让我们的行为就像是一个网络主机一样 多年来 我们慢慢退出了托管业务 但我们的
  • Oracle默认的日期格式是YYYY-MM-DD,为什么?

    Oracle 的默认日期格式是 YYYY MM DD 这意味着如果我这样做 select some date from some table I lose我约会的时间部分 是的 我知道你可以通过以下方式 解决 这个问题 alter sess
  • 是否可以获得“this”指针的地址?

    我读到了this是一个右值 我们无法通过应用来获取它的地址 this 在我的代码中 我尝试使用引用绑定this 我想知道哪种方式可以给出地址this 还是两者都错了 到底是什么this 左值 右值 关键字还是其他什么 void MyStri
  • 数独求解算法 C++

    我花了几天时间尝试制作一个数独解决程序 但我被这些方法所困扰 我在这里找到了这个算法 但我不太理解它 从第一个空单元格开始 并在其中输入 1 检查整个板子 看看是否有冲突 如果板上存在冲突 请将当前单元格中的数字加 1 因此将 1 更改为
  • SQL NOT IN 可能存在性能问题

    我正在尝试重构几段旧代码 我已经重构了下面的当前代码并突出显示了NOT IN语句导致性能问题 我正在尝试重写NOT IN具有左外连接的部分 如果可能的话 任何人都可以帮忙 或者建议更好的方法吗 SELECT left unique id 1
  • 有没有流畅的WPF项目? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 作为我不断尝试使用 WPF XAML 的一部分 我对 UI 编码中流畅界面的应用产生了兴趣 我知道 Fluent Silverlight http c
  • 在 BeforeClose 事件期间保存 Word 文档时,并不总是触发 Shutdown 事件

    我有一个 Microsoft Word 插件 使用VSTO and c 对于每个文档 我使用文档 ShutDown 事件来清理我的父对象 并使用 BeforeClose 事件来对我的父对象进行预关闭验证 我的验证需要保存文档并尝试在 Bef
  • 在 Android 中选择 EGL 配置的正确方法是什么?

    我正在使用自己的 GLSurfaceView 并且一段时间以来一直在努力解决与 EGL 配置选择器相关的崩溃问题 似乎通过调用请求 RGB 565setEGLConfigChooser 5 6 5 0 16 0 应该是最受支持的 然而 使用
  • 上课需要记忆吗?

    class Test int x int main cout lt lt sizeof Test return 0 输出 4我只是想问 即使我没有创建 Test 类的任何对象 为什么它会打印 4 sizeof X 是字节数X创建时需要 致电
  • 使用 Apache AGE 制作最短路径

    我一直在阅读 Jasper Blues 的博客文章 使用 NEO4J 进行摇滚式流量路由 https medium com neo4j rock n roll traffic routing with neo4j 3a4b863c6030但
  • 我应该如何在 axios GET 请求中发送 JWT 令牌? [复制]

    这个问题在这里已经有答案了 我是 Vue js 新手 想要在组件中向受限 api 发出请求 computed token return this store getters getToken created axios get this B
  • 函数构造函数和原型构造函数有什么区别?

    我想知道这有什么区别 MyClass function MyClass prototype Foo function and this MyClass MyClass prototype constructor function MyCla
  • 如何在androidsharedPreference中存储类对象?

    我想将类对象存储在android共享首选项中 我对此进行了一些基本搜索 得到了一些答案 例如使其可序列化对象并存储它 但我的需求非常简单 我想存储一些用户信息 例如姓名 地址 年龄和布尔值是否处于活动状态 我为此创建了一个用户类 publi
  • asp.net mvc 按名称和区域查找控制器

    我的目标是从控制器的名称和区域中找到控制器 如果我当前的httpContext与待找到的控制器位于同一区域内 但是 我无法拨打电话ControllerFactory考虑面积 这是我的代码 public static ControllerBa
  • 匹配 JavaScript 中除特定模式之外的所有内容

    经过多次搜索 我仍然感到困惑 如何匹配字符串中除与给定模式匹配的内容之外的所有内容 我找到了使用以下方法否定特定单词或字符集的解决方案 或负面展望 但我需要一个解决方案来否定任何与特定模式匹配的内容 示例文本 html 片段 abcd ef
  • java.lang.IllegalStateException:指定的子级已经有父级

    当我第一次实例化一个片段时 我正在使用片段 但第二次我遇到了这个例外 我找不到出错的行 04 04 08 51 54 320 E AndroidRuntime 29713 FATAL EXCEPTION main 04 04 08 51 5
  • GPU 上非原子写入的保证很弱吗?

    OpenCL 和 CUDA 包含原子操作已有好几年了 尽管显然并非每个 CUDA 或 OpenCL 设备都支持这些操作 但是 我的问题是关于由于非原子写入而 共存 种族的可能性 假设网格中的多个线程都写入全局内存中的同一位置 我们是否可以保