OpenCL内存一致性

时间:2018-08-09 14:13:17

标签: 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函数的定义如下:

  

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

这与3.3.1节矛盾吗?还是我对加载/存储一致性的理解是错误的?感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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

障碍之间:

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

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