在 OpenCL 中,mem_fence() 与 Barrier() 相比有何作用?

2024-01-10

Unlike barrier()(我想我明白),mem_fence()不影响工作组中的所有项目。 OpenCL 规范指出(第 6.11.10 节),对于mem_fence():

命令加载和存储执行内核的工作项。

(所以它适用于single工作项)。

但同时,在第 3.3.1 节中,它说:

在工作项内存中具有加载/存储一致性。

so within一个工作项的内存是一致的。

那么到底是什么样的事情mem_fence()对...有用?它不能跨项目工作,但在项目内不需要......

请注意,我没有使用原子操作(第 9.5 节等)。这个想法是mem_fence()是和那些一起使用的?如果是这样,我很想看一个例子。

Thanks.

规格,供参考。 http://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf

Update: 我可以看到它在使用时有什么用处with barrier()(隐含地,因为屏障调用mem_fence()) - 但肯定还有更多,因为它是单独存在的?


为了更清楚地表达(希望如此),

mem_fence()等待直到 mem_fence() 之前调用工作项对本地和/或全局内存进行的所有读/写对工作组中的所有线程可见。

这来自:http://developer.download.nvidia.com/presentations/2009/SIGGRAPH/asia/3_OpenCL_Programming.pdf http://developer.download.nvidia.com/presentations/2009/SIGGRAPH/asia/3_OpenCL_Programming.pdf

内存操作可以重新排序以适合它们运行的​​设备。该规范(基本上)规定,任何内存操作的重新排序都必须确保内存在单个工作项内处于一致的状态。但是,如果您(例如)执行存储操作并且值决定暂时驻留在工作项特定的缓存中,直到出现更好的时间写入本地/全局内存,该怎么办?如果您尝试从该内存加载,写入该值的工作项会将其保存在其缓存中,因此没有问题。但工作组内的其他工作项则不然,因此它们可能会读取错误的值。放置内存栅栏可确保在调用内存栅栏时,本地/全局内存(根据参数)将保持一致(任何缓存都将被刷新,并且任何重新排序都将考虑到您期望其他线程可能会发生的情况)需要在此之后访问此数据)。

我承认这仍然令人困惑,我不会发誓我的理解是100%正确的,但我认为这至少是总体想法。

跟进:

我发现这个链接讨论了 CUDA 内存栅栏,但同样的一般思想也适用于 OpenCL:

http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/NVIDIA_CUDA_Programming_Guide_2.3.pdf http://developer.download.nvidia.com/compute/cuda/2_3/toolkit/docs/NVIDIA_CUDA_Programming_Guide_2.3.pdf

查看部分B.5 内存栅栏功能.

他们有一个代码示例,可以在一次调用中计算一组数字的总和。该代码被设置为计算每个工作组中的部分和。然后,如果需要进行更多求和,代码将让最后一个工作组来完成工作。

因此,每个工作组基本上完成两件事:更新全局变量的部分求和,然后计数器全局变量的原子增量。

此后,如果还有更多工作要做,则将计数器增加到值(“工作组大小”- 1)的工作组将被视为最后一个工作组。该工作组将继续完成工作。

现在,问题(正如他们所解释的)是,由于内存重新排序和/或缓存,计数器可能会增加,并且最后一个工作组可能会在部分总和全局变量完成之前开始执行其工作。写入全局内存的最新值。

内存栅栏将确保在移过栅栏之前所有线程的部分和变量的值是一致的。

我希望这有一定道理。这很令人困惑。

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

在 OpenCL 中,mem_fence() 与 Barrier() 相比有何作用? 的相关文章

  • OpenCL - 将树复制到设备内存

    我用 C 代码实现了二叉搜索树 我的每个树节点如下所示 typedef struct treeNode int key struct treeNode right struct treeNode left treeNode t 宿主建造的树
  • 有多少线程(或工作项)可以同时运行?

    我是 GPGPU 编程新手 正在研究 OpenCL 的 NVIDIA 实现 我的问题是如何计算 GPU 设备的限制 线程数 据我了解 有许多工作组 相当于 CUDA 中的块 其中包含许多工作项 cuda 线程 如何获取我的卡上存在的工作组数
  • PyOpenCL 矩阵乘法

    我有使用 pyopenCL 进行矩阵乘法的代码 我的问题是某些矩阵的结果是错误的 我不明白为什么 经过一番研究后 我认为它与类似的全球规模有关 但我不明白如何设置该值 例如 使用 numpy dtype float32 的矩阵 矩阵1 0
  • OpenCl 代码可以在一台机器上运行,但我在另一台机器上收到 CL_INVALID_KERNEL_ARGS

    我有以下代码 它在一台机器上运行良好 但是当我尝试在另一台具有更好显卡的机器上运行它时 我收到错误 global 0 512 global 1 512 local 0 16 local 1 16 ciErrNum clEnqueueNDRa
  • 您能否将具有更严格内存排序的原子加载存储拆分为单独的宽松加载存储以及内存屏障指令?

    下面是用于跨线程数据同步的获取 释放语义的简单示例 thread 1 thread 2 data 100 flag store true std memory order release while flag load std memory
  • 多个 OpenCl 内核

    我只是想问 是否有人可以提醒我在相继使用几个简单内核时要注意什么 我可以用同样的吗CommandQueue 我可以跑几次吗clCreateProgramWithSource cl program与不同的cl program 我忘记了什么 T
  • 使用 Final 字段的成本

    我们知道 将字段设置为final通常是一个好主意 因为我们获得了线程安全性和不变性 这使得代码更容易推理 我很好奇是否有相关的性能成本 Java 内存模型保证了这一点final Field Semantics http docs oracl
  • std::memory_order_seq_cst 的工作原理

    我从以下位置获取了有关 std memory order seq cst 的示例 http en cppreference com w cpp atomic memory order http en cppreference com w c
  • 如何在 Docker 容器内运行 OpenCL + OpenGL?

    目的是在 Docker 容器内运行 OpenCL OpenGL 互操作 应用程序 但我还没有成功 Intro 我有配备 NVidia 显卡的笔记本电脑 因此我认为利用 NVidia Dockerfiles 1 2 将是一个很好的起点 以下
  • 如何在 Windows 上的 nvidia GPU 的 Visual Studio 2010 中配置 OpenCL?

    我在华硕笔记本电脑上的 Wwindows 7 操作系统上使用 NVIDIA GeForce GTX 480 GPU 我已经为 CUDA 4 2 配置了 Visual Studio 2010 如何在 Visual Studio 2010 上为
  • 某些子网格未使用 CUDA 动态并行执行

    我正在尝试 CUDA 5 0 GTK 110 中的新动态并行功能 我遇到了一个奇怪的行为 即我的程序没有返回某些配置的预期结果 不仅是意外的 而且每次启动都会出现不同的结果 现在我想我找到了问题的根源 似乎当生成太多子网格时 某些子网格 由
  • 使用 Fortran (CLFORTRAN) 在 OpenCL 中将两个选项作为参数传递

    当我的主机程序采用 C 语言时 我可以传递两个选项作为 OpenCL 函数的参数 例如 我可以通过两个 标志到clCreateBuffer像这样的函数 clCreateBuffer context CL MEM READ ONLY CL M
  • OpenCL 矩阵乘法应该更快?

    我正在尝试学习如何使 GPU 优化 OpenCL 内核 我以使用本地内存中的方形图块进行矩阵乘法为例 然而在最好的情况下 我只得到了约 10 倍的加速 约 50 Gflops 与 numpy dot 相比 5 Gflops 它使用的是 BL
  • 在内核 OpenCL 中实现 FIFO 的最佳方法

    目标 在 OpenCL 中实现下图所示 OpenCl 内核所需的主要内容是将系数数组和临时数组相乘 然后最后将所有这些值累加为 1 这可能是最耗时的操作 并行性在这里非常有帮助 我正在为内核使用一个辅助函数来执行乘法和加法 我希望这个函数也
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • OpenCL 何时使用全局、私有、本地、常量地址空间

    我正在尝试学习 OpenCL 但我很难决定使用哪些地址空间 因为我只找到组装的资源声明这些地址空间是什么 但没有声明它们为什么存在或何时使用它们 资源至少太分散了 所以带着这个问题我希望把所有这些信息汇总一下 所有地址空间是什么 它们为什么
  • 缓存一致性是否始终可以防止读取过时的值?失效队列允许吗?

    在 MESI 协议中 仅当将缓存行保持在独占 修改状态时才写入缓存行 要获取独占状态 您可以向持有同一高速缓存行的所有核心发送无效请求 但是是否存在一种微架构 其中某些内核会在实际使缓存线无效之前做出确认响应 如果确实如此 那不是违反了缓存
  • 内存屏障:软件黑客的硬件视图示例 3

    我正在从原始论文中复制该图的文本 内存屏障 软件黑客的硬件视图 http www rdrop com 7Epaulmck scalability paper whymb 2010 06 07c pdf 表 4 显示了由 CPU 0 1 和
  • cudaDeviceScheduleBlockingSync 和 cudaDeviceScheduleYield 之间有什么区别?

    正如这里所说 如何减少 CUDA 同步延迟 延迟 https stackoverflow com questions 11953722 how to reduce cuda synchronize latency delay 等待设备结果有
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或

随机推荐