在 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() 相比有何作用? 的相关文章

  • 除了提供必要的保证之外,硬件内存屏障是否还能使原子操作的可见性更快?

    TL DR 在生产者 消费者队列中 放置不必要的 从 C 内存模型的角度来看 内存栅栏或不必要的强内存顺序是否有意义 以牺牲可能更差的吞吐量为代价获得更好的延迟 C 内存模型在硬件上执行 通过为更强的内存顺序设置某种内存栅栏 而不是在较弱的
  • CUDA PTX 代码 %envreg<32> 特殊寄存器

    我尝试使用 CUDA 驱动程序 API 运行由 cl 内核生成的 PTX 汇编代码 我采取的步骤是这些 标准 opencl 程序 1 加载 cl内核 2 JIT编译 3 获取编译好的ptx代码并保存 到目前为止 一切都很好 我注意到 ptx
  • 多个 OpenCl 内核

    我只是想问 是否有人可以提醒我在相继使用几个简单内核时要注意什么 我可以用同样的吗CommandQueue 我可以跑几次吗clCreateProgramWithSource cl program与不同的cl program 我忘记了什么 T
  • Linux 上的 OpenCL,集成英特尔图形芯片

    我想用OpenCL在 Debian 8 上 我读到在本页 http streamcomputing eu blog 2011 12 29 opencl hardware support Linux 上不支持 Intel 的 GPU 这篇文章
  • 在 Windows 8 (x64) 中安装期间出现 PyOpenCL“致命错误:CL/cl.h:没有此类文件或目录”错误

    在大量搜索此问题的解决方案后 我发现此特定错误尚未针对 Windows 正确记录 所以我决定将这个问题与解决方案一起发布 抱歉 如果我将其发布在错误的部分 我希望这个解决方案能够帮助用户解决未来 PyOpenCL 安装错误 请注意 此处使用
  • 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
  • 如何在 Linux 中分析 PyCuda 代码?

    我有一个简单的 经过测试的 pycuda 应用程序 正在尝试对其进行分析 我尝试过 NVidia 的 Compute Visual Profiler 它运行该程序 11 次 然后发出以下错误 NV Warning Ignoring the
  • OpenCL:为什么指向指针的指针不能作为参数传递给内核函数?

    你好 我只是想澄清一下为什么我们不能将 2D 数组指针作为参数传递给内核 为什么不允许 如果我使用它作为参数会发生什么 在内部 因为我知道代码会给出一些错误 请只做那些需要的 因为在 OpenCL 1 x 中设备有一个独立的地址空间 在设备
  • 有一个不错的 OpenCL 入门套件吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一些经验OpenGL它是可编程管道 我愿意给OpenCL不过 尝试一下 有人可以提出一个很好的集成套件来使用OpenCL 我只知道石英作曲家看起来
  • std::mutex 会创建栅栏吗?

    如果我锁定一个std mutex我总会得到一个记忆栅栏吗 我不确定这是否暗示或强迫你获得栅栏 Update 根据 RMF 的评论找到了这个参考资料 多线程编程和内存可见性 http en wikipedia org wiki Memory
  • 使用 Fortran (CLFORTRAN) 在 OpenCL 中将两个选项作为参数传递

    当我的主机程序采用 C 语言时 我可以传递两个选项作为 OpenCL 函数的参数 例如 我可以通过两个 标志到clCreateBuffer像这样的函数 clCreateBuffer context CL MEM READ ONLY CL M
  • 杀死 OpenCL 内核

    有没有办法通过 OpenCL API 终止正在运行的 OpenCL 内核 我在规范中没有找到任何内容 我能想到的唯一解决方案是 1 定期检查内核中主机希望内核停止时写入的标志 或 2 在单独的进程中运行内核并终止整个进程 我认为这两个都不是
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • Linux 上的 OpenCL 编译

    我是 OpenCL 的新手 从昨天开始 我尝试使用 OpenCL 进行并行编程 而不是使用我更熟悉且以前体验过的 CUDA 现在我有 NVIDIA GTX 580 GPU Ubuntu Linux 12 04 操作系统和 CUDA SDK
  • 缓存一致性是否始终可以防止读取过时的值?失效队列允许吗?

    在 MESI 协议中 仅当将缓存行保持在独占 修改状态时才写入缓存行 要获取独占状态 您可以向持有同一高速缓存行的所有核心发送无效请求 但是是否存在一种微架构 其中某些内核会在实际使缓存线无效之前做出确认响应 如果确实如此 那不是违反了缓存
  • OpenCL 内核在 Nvidia GPU 上每个线程使用多少寄存器?

    我的第一个问题是如何获取 Nvidia GPU 上 OpenCL 内核代码的寄存器使用信息 因为 nvcc 编译器给出了相同的使用信息nvcc ptxas options vCUDA 内核代码的标志 我还从 AMD GPU for Open
  • 从另一个 OpenCL 内核调用 OpenCL 内核

    我在这里的一篇文章中看到 我们可以从 OpenCL 内核调用函数 但在我的情况下 我还需要并行化该复杂函 数 由所有可用线程运行 所以我是否也必须将该函数设为内核并像主内核中的函数一样直接调用它 或者这种情况有什么可能的解决方案 提前致谢
  • HUGE_VALF 和 INFINITY 常量之间的区别

    在 OpenCL 中 有两个代表无穷大的浮点数学常数 其中之一很简单INFINITY 另一个 HUGE VALF 求值为 无穷大 这两者有什么区别 求值至 无穷大是什么意思 HUGE VALF是一个旧名称 允许不支持无穷大的浮点系统 例如
  • OSX 上的 ATI OpenCL SDK

    我拥有 ATI GK 的新 MPB 我很好奇 我是否可以下载 OSX 的 sdk 特别是示例集合和分析器 或者我必须本地运行 Windows Linux 因为我只找到了 Windows 和 Linux 的版本 提前致谢 只要您有 Mac O
  • OpenCL 内核参数中的 Char***?

    我需要通过一个vector

随机推荐