【问题标题】:OpenCL memory consistencyOpenCL 内存一致性
【发布时间】:2019-01-17 01:17:33
【问题描述】:

我有一个关于 OpenCL 内存一致性模型的问题。考虑以下内核:

__kernel foo() {
    __local lmem[1];
    lmem[0]  = 1;
    lmem[0] += 2;
}

在这种情况下,是否需要任何同步或内存栅栏来确保lmem[0] == 3

根据 OpenCL 规范的第 3.3.1 节,

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

对我来说,这意味着赋值总是在增量之前执行。

但是,第 6.12.9 节将mem_fence 函数定义如下:

命令加载和存储执行内核的工作项。这意味着 mem_fence 之前的加载和存储将在 mem_fence 之后的任何加载和存储之前提交到内存。

这不是与第 3.3.1 节相矛盾吗?或者我对加载/存储一致性的理解是错误的?非常感谢您的帮助。

【问题讨论】:

    标签: memory opencl


    【解决方案1】:

    只要只有一个工作项对local 内存单元执行读/写访问,该工作项就具有一致的视图。只有在将写入传播到工作组中的其他工作项时才需要使用屏障来提交内存。例如,允许 OpenCL 实现将对 local 内存的任何更改保留在私有寄存器中,直到遇到障碍。在工作项中,一切看起来都很好,但其他工作项永远不会看到这些变化。这就是短语“committed to memory”在 6.12.9 中的解释方式。

    本质上,本地内存和屏障之间的交互可以归结为:

    障碍之间:

    1. 仅允许一个工作项对本地存储单元进行读/写访问。
    2. 允许工作组中的任意数量的工作项对本地存储单元进行只读访问。

    换句话说,任何工作项都不能读取或写入本地内存单元,而该内存单元在最后一个屏障之后被另一个工作项写入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2012-09-09
      • 2011-07-21
      • 2012-09-21
      • 2015-09-06
      • 2012-11-02
      • 2015-07-06
      相关资源
      最近更新 更多