【发布时间】: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 节相矛盾吗?或者我对加载/存储一致性的理解是错误的?非常感谢您的帮助。
【问题讨论】: