Memory OpenCL内存一致性

Memory OpenCL内存一致性,memory,opencl,Memory,Opencl,我有一个关于OpenCL内存一致性模型的问题。考虑下面的内核: __kernel foo() { __local lmem[1]; lmem[0] = 1; lmem[0] += 2; } 在这种情况下,是否需要任何同步或内存围栏来确保lmem[0]==3 根据OpenCL规范第3.3.1节 在工作项中,内存具有加载/存储一致性 对我来说,这意味着赋值将始终在增量之前执行 但是,第6.12.9节对mem_fence功能的定义如下: 命令加载和存储执行内核的工作项。这意

我有一个关于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节相矛盾?或者我对加载/存储一致性的理解是错误的?非常感谢您的帮助。

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

从本质上讲,本地内存和屏障之间的相互作用归结为:

障碍之间:

  • 仅允许一个工作项对本地存储单元进行读/写访问。
  • 允许工作组中任意数量的工作项以只读方式访问本地内存单元
  • 换句话说,任何工作项都不能读取或写入由最后一个屏障之后的另一个工作项写入的本地存储单元