gpt4 book ai didi

opencl - 在 OpenCL 中,与 barrier() 相比,mem_fence() 做什么?

转载 作者:行者123 更新时间:2023-12-04 02:19:37 25 4
gpt4 key购买 nike

不像 barrier() (我想我明白了),mem_fence()不会影响工作组中的所有项目。 OpenCL 规范说(第 6.11.10 节),适用于 mem_fence() :

Orders loads and stores of a work-item executing a kernel.



(因此它适用于单个工作项)。

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

Within a work-item memory has load / store consistency.



所以在一个工作项中,内存是一致的。

那么什么是 mem_fence()对...有用?它不适用于跨项目,但在项目中不需要...

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

谢谢。

The spec, for reference.

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

最佳答案

试着把它说得更清楚(希望如此),

mem_fence() waits until all reads/writes to local and/or global memory made by the calling work-item prior to mem_fence() are visible to all threads in the work-group.



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

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

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

跟进:

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

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

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

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

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

之后,如果还有更多工作要做,则将计数器增加到 ("work-group size"- 1) 的值的工作组将被视为最后一个工作组。该工作组继续完成。

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

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

我希望这是有道理的。这令人困惑。

关于opencl - 在 OpenCL 中,与 barrier() 相比,mem_fence() 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7673990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com