Memory OpenCL内存一致性
我有一个关于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功能的定义如下: 命令加载和存储执行内核的工作项。这意
__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中短语“致力于记忆”的解释方式
从本质上讲,本地内存和屏障之间的相互作用归结为:
障碍之间:
或