不同内核的线程如何访问同一全局内存地址?

2024-01-14

如果一个线程束中的许多线程想要读取全局内存中的某个地址,那么该数据就会被广播,对吗?

如果 warp 中的许多线程想要写入全局内存中的某个地址,则存在序列化,但无法预测顺序,对吗?

但是,第一个问题:如果不同扭曲、不同块中的许多线程想要写入全局内存中的地址? GPU会做什么?序列化所有对该地址的访问?数据一致性有保障吗?

通过 Hyper-Q,可以启动许多包含内核的流。如果我在内存中有一个位置,并且不同内核中的多个线程想要写入或读取这个地址,那么GPU会做什么?序列化来自不同内核的所有线程的访问,还是 GPU 不执行任何操作并且会发生一些不一致?当多个内核读/写同一地址时,是否能保证数据的一致性?


最好每个问题只问一个问题。

如果一个线程束中的许多线程想要读取全局内存中的某个地址,那么该数据就会被广播,对吗?

是的,对于 Fermi (CC2.0) 及更高版本来说确实如此。

如果 warp 中的许多线程想要写入全局内存中的某个地址,则存在序列化,但无法预测顺序,对吗?

正确的。顺序未定义。

如果不同扭曲、不同块中的许多线程想要写入全局内存中的地址? GPU会做什么?序列化所有对该地址的访问?

如果访问是同时进行的,则它们是串行的。同样,顺序是未定义的。

数据一致性有保障吗?

不确定你所说的数据一致性是什么意思。不管怎样,除了串行化同时写入之外,GPU 还能做什么?我很惊讶这是一个如此困难的概念,因为在我看来没有明显的替代方案。

如果我在内存中有一个位置,并且不同内核中的多个线程想要写入或读取该地址,那么 GPU 会做什么?串行化来自不同内核的所有线程的访问,或者 GPU 不执行任何操作并且会发生一些不一致?当多个内核读/写同一地址时,是否能保证数据的一致性?

同时写入全局内存的来源是什么并不重要,无论是来自相同的扭曲,还是不同的扭曲,在不同的块中,在不同的内核中。同时写入以未定义的顺序进行序列化。再次,对于“数据一致性”,我想知道你的意思。同时读取and写入也会产生未定义的行为。读取可能返回一个值,包括存储位置的初始值或任何已写入的值。

同时写入任何 GPU 内存位置的最终结果是未定义的。如果所有同时写入都写入相同的值,则该位置的最终值将反映这一点。否则,最终值将反映写入的值之一。哪个值未定义。除此之外,你的大多数问题和陈述对我来说毫无意义。 (数据一致性是什么意思?)您不应该期望从这种编程行为中得到任何合理的东西。 GPU应该被编程为分布式独立工作机器,而不是全局同步机器。请注意,“未定义”还意味着即使输入数据相同,每次运行内核的结果也可能会有所不同。

在 Fermi (cc2.x) 设备上,由于 SM 之间插入了独立的非一致 L1 缓存(其中线程块执行)和 L2 缓存(这是设备范围的,因此是一致的)。尝试使用全局内存作为工具在线程块之间创建同步行为是很困难的,而且不鼓励。建议考虑重新设计算法以独立构建工作的方法。

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

不同内核的线程如何访问同一全局内存地址? 的相关文章

  • Yocto for Nvidia Jetson 由于 GCC 7 而失败 - 无法计算目标文件的后缀

    我正在尝试将 Yocto 与 meta tegra 一起使用 https github com madisongh meta tegra https github com madisongh meta tegra 为 Nvidia Jets
  • 加速Cuda程序

    要更改哪一部分来加速此代码 代码到底在做什么 global void mat Matrix a Matrix b int tempData new int 2 tempData 0 threadIdx x tempData 1 blockI
  • Cuda 6.5 找不到 - libGLU。 (在 ubuntu 14.04 64 位上)

    我已经在我的ubuntu上安装了cuda 6 5 我的显卡是 GTX titan 当我想要制作 cuda 样本之一时 模拟 粒子 我收到这条消息 gt gt gt WARNING libGLU so not found refer to C
  • 使用 CUDA 进行逐元素向量乘法

    我已经在 CUDA 中构建了一个基本内核来执行逐元素两个复向量的向量 向量乘法 内核代码插入如下 multiplyElementwise 它工作正常 但由于我注意到其他看似简单的操作 如缩放向量 在 CUBLAS 或 CULA 等库中进行了
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • 从 CUDA 设备写入输出文件

    我是 CUDA 编程的新手 正在将 C 代码重写为并行 CUDA 新代码 有没有一种方法可以直接从设备写入输出数据文件 而无需将数组从设备复制到主机 我假设如果cuPrintf存在 一定有地方可以写一个cuFprintf 抱歉 如果答案已经
  • CUDA - 将 CPU 变量传输到 GPU __constant__ 变量

    与 CUDA 的任何事情一样 最基本的事情有时也是最难的 所以 我只想将变量从 CPU 复制到 GPUconstant变量 我很难过 这就是我所拥有的 constant int contadorlinhasx d int main int
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每
  • CUDA:获取数组中的最大值及其索引

    我有几个块 每个块在整数数组的单独部分上执行 举个例子 块一从 array 0 到 array 9 块二从 array 10 到 array 20 我可以获得每个块的数组最大值的索引的最佳方法是什么 示例块一 a 0 到 a 10 具有以下
  • PyInstaller 是否包含 CUDA

    我正在开发一个Python脚本 我使用Python 3 7 3 它使用tensorflow gpu 1 14 0 并使用PyInstaller 3 5将此脚本转换为可执行文件 我使用的是 CUDA 10 0 和 cuDNN 7 6 1 我的
  • cudaDeviceScheduleBlockingSync 和 cudaDeviceScheduleYield 之间有什么区别?

    正如这里所说 如何减少 CUDA 同步延迟 延迟 https stackoverflow com questions 11953722 how to reduce cuda synchronize latency delay 等待设备结果有
  • NVCC 警告级别

    我希望 NVCC 将以下警告视为错误 warning calling a host function foo from a host device function bar NVCC 文档 NVIDIA CUDA 编译器驱动程序 NVCC
  • CUDA 模型 - 什么是扭曲尺寸?

    最大工作组大小和扭曲大小之间有什么关系 假设我的设备有 240 个 CUDA 流处理器 SP 并返回以下信息 CL DEVICE MAX COMPUTE UNITS 30 CL DEVICE MAX WORK ITEM SIZES 512
  • 为什么 cudaGLSetGLDevice 失败,即使它是在 main 函数的第一行中调用的

    我想使用 OpenGL 和 CUDA 之间的互操作性 我知道 正如一些教程所说 第一步是选择设备 但是 当我在主函数的第一行中调用 cudaGLSetGLDevice 0 时 程序退出并显示信息 cudaSafeCall 运行时 API 错
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • 如何安装libcusolver.so.11

    我正在尝试安装 Tensorflow 但它要求 libcusolver so 11 而我只有 libcusolver so 10 有人可以告诉我我做错了什么吗 这是我的 Ubuntu nvidia 和 CUDA 版本 uname a Lin
  • CUDA 和 Eigen 的成员“已声明”错误

    我只是 CUDA 和 Nsight 的初学者 希望利用出色的 GPU 性能进行线性代数运算 例如 CUBLAS 我在以下人员的帮助下编写了很多自定义代码Eigen http eigen tuxfamily org index php tit
  • 如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?

    我在 cpp 文件中对 cuSPARSE 库进行了一些调用 这些调用在旧工具包中不可用 为了支持使用旧工具包的系统 我想使用编译器指令编译不同的代码部分 特别是 我想使用旧工具包的 CSR 格式矩阵和新工具包的 BSR 格式矩阵来求解稀疏三
  • 为什么使用 boost::none 无法通过 nvcc 编译?

    我正在尝试编译以下代码 include
  • CUDA cutil.h 在哪里?

    有谁知道包含 cutil h 的 SDK 工具包在哪里 我尝试了 CUDA toolkits3 2 和 toolkits5 0 我知道这个版本已经不支持 cutil h 我还注意到一些提到的如何在 Linux 中包含 cutil h htt

随机推荐

  • 通过 canvas.toDataURL 将画布保存到图像会产生黑色矩形

    我正在使用 Pixi js 并尝试将动画帧保存到图像中 canvas toDataUrl 应该可以工作 但我得到的只是一个黑色矩形 查看实例here http anatoliyg github io toaster 我用来提取图像数据并设置
  • .Net Core 和完整框架项目合二为一

    假设我有一个包含多个项目的解决方案 其中一个项目是 Main 放置通用代码和 API 其余项目是 Main 的扩展 Extension1 Extension2 Extension3 并使用第三方库 现在我正在使解决方案在完整框架和 Net
  • Pickle ImportError:没有名为 __builtin__ 的模块

    我正在尝试在 python3 6 中加载 复制的 pickle 对象 但出现导入错误 builtin r当我这样做时 with open FilePath FileName pkl rb as file file pickle load f
  • 生产 JVM 的安全调试

    我们有一些应用程序有时会进入不良状态 但仅限于生产环境 当然 虽然进行堆转储有助于收集状态信息 但使用远程调试器通常更容易 设置起来很简单 只需将其添加到命令行中即可 Xdebug Xrunjdwp 传输 dt socket 服务器 y 挂
  • R:如何从列表的每个内部元素中删除第一个元素而不将其转换为矩阵?

    我有一个这样的清单 1 1 a1 b1 c1 2 1 a2 b2 c2 3 1 a3 b3 c3 我希望从它的每个部分中删除特定元素 1 1 a1 c1 2 1 a2 c2 3 1 a3 c3 I tried tail但删除 外部 元素 也
  • PHP + MySQL 中的递归逻辑

    我正在尝试应用递归逻辑 我有以下数据tbl appointment table recur type 1 每周 2 每月 0 非递归 appointment id user id date recur type 18 56 2014 06
  • Java Web 应用程序可以访问远程工作站上的智能卡读卡器吗?

    我正在为我们现有的基于 Java 的 Web 应用程序之一开发一些新功能 该网络应用程序本身托管在我们的一台内部服务器上 可以通过我们工厂内多个计算机终端的浏览器进行访问 该应用程序用于在我们生产过程的各个阶段进行质量检查 目前 在进行每次
  • Megaparsec:无法解析递归算术字符串

    我正在使用 Megaparsec 开发一个小型解析器并尝试解析算术 Arithmetic expressions data Aexp N Num V Var Mult Aexp Aexp Add Aexp Aexp Sub Aexp Aex
  • 如何在使用 png() 保存时修复 R 中 ggplot 的大小?

    地图尺寸 经纬度 38 31536111 76 55011111 与地图不同 纬度 经度 59 5624775 139 7410994 在地图上标绘点 用 png 保存时 如何保持尺寸一致 高度和宽度不够 编辑 完整代码 library m
  • 删除sqlite中的第一行后如何重新排列表?

    我在 sqlite 中有 1 个表 我正在向该表插入值 当插入行id大于100时 我想删除第一个插入的记录并在第100个位置插入新记录 我被删除了第一个记录 但第二个记录在第二个位置 但我想在删除第一行后重新排列记录 我该怎么做 我的表名称
  • 我将如何等待多个线程停止?

    我有一个主线程 它生成大约 20 个工作线程 我需要停止主线程 直到所有其他线程完成 我知道 线程 加入 但这仅适用于一个线程 多个连接会像这样损害性能 t1 Join t2 Join t20 Join 因为程序会一一等待每个停止 我怎样才
  • 触发器后不允许更新新行

    为什么我使用这个会出现错误trigger CREATE TRIGGER save Assignee AFTER INSERT ON changeitem FOR EACH ROW BEGIN SET new assignee SELECT
  • Xcode调试问题

    我的 Xcode 调试器有一个小问题 在我看来 步入 功能并没有发挥应有的作用 或者正如我所期望的那样 我可以介入任何方法调用 只要它没有返回值 myObject DoSomething find 可以工作 但如果该方法有返回值 则没有 S
  • LolliPop 设备中的 AutoCompleteTextView 奇怪行为

    我在用AutoCompleteTextView在我的布局中 但它是colorControlNormal and Activate没有按我的预期工作 我的颜色值为 0072BA 下图是不同设备的图 1 安卓奇巧 2 Android 棒棒糖 3
  • IOS:一个IBAction用于多个按钮

    在我的项目中 我必须控制40个按钮的操作 但我不想创建40个IBAction 我可以只使用一个IBAction吗 如果您使用界面生成器来创建按钮 只需将它们指向相关类中的相同 IBAction 即可 然后 您可以通过读取按钮中的文本来区分
  • 在比较第 1 列 1 个文件与第 1 列 N 个文件的比较的基础上进行分析,并根据第 1 列打印所有文件

    我有制表符分隔的文件 需要将 FILE 1 与 N 10 个文件进行比较 如果第一个文件的第 1 列的 IDS 与其他文件的第一列匹配 则打印文件 1 和其他文件的值 如果 IDS 不存在 第一个文件和其他文件的列不适用 下面给出了输入和预
  • 检测连接到 Wifi 的 Android 设备

    我想制作一个连接到 Wifi 网络的 Android 应用程序 假设网络 SSID ABC 假设它已连接到 Wifi ABC 连接到 ABC 后 我希望我的应用程序显示连接到同一 wifi ABC 网络的所有 Android 设备的 ip
  • 使用 Parallel.For 和 EPPlus 创建 Excel 工作表

    我正在使用EPPlus http epplus codeplex com 库来创建包含许多工作表的 Excel 工作簿 我想知道并行构建工作表是否安全 如果库支持这种行为 我在 有限的 文档中找不到提及 package new ExcelP
  • 在 Visual Studio 2013 中的托管单元测试上使用混合模式调试

    我在 Visual Studio 2013 测试框架中有一个 C 单元测试 它练习 CLI 和本机代码 我想在执行 C 单元测试时研究代码的本机部分 但是 运行 测试 gt 调试 gt 所有测试 会运行托管调试器 因此不会命中本机代码中的断
  • 不同内核的线程如何访问同一全局内存地址?

    如果一个线程束中的许多线程想要读取全局内存中的某个地址 那么该数据就会被广播 对吗 如果 warp 中的许多线程想要写入全局内存中的某个地址 则存在序列化 但无法预测顺序 对吗 但是 第一个问题 如果不同扭曲 不同块中的许多线程想要写入全局