OpenCL 1.2原子操作相关的全局内存一致性问题咨询
OpenCL 1.2中原子操作跨工作组全局同步问题
场景与实现逻辑
我用数组形式存储二叉树,需要计算各节点的值——内部节点的值依赖其子节点的计算结果。我生成了n个线程,从叶子节点遍历至根节点,针对单个节点的处理逻辑如下:
- 两个线程(可能属于不同工作组)对全局内存中预初始化为0的计数器执行
atomic_inc原子递增操作 - 若
atomic_inc返回0,该线程直接返回(作为首次访问者) - 若
atomic_inc返回1,该线程计算当前节点的值(内部节点会使用其子节点的计算结果),然后转向父节点重复此流程(作为第二次访问者)
通过这个逻辑,本应保证处理父节点时,其子节点已经处理完成。这套逻辑在CPU线程池上已经实现并正常运行。
遇到的问题
在OpenCL实现中,出现了不符合预期的异常:
- 读取内部节点的子节点计算值时,少数情况下拿到的是过期或未初始化的值
- 子节点对应的计数器(仅通过原子操作修改)也会返回过期值(例如0或1,而非预期的2)
- 按照设计逻辑,父节点的处理绝不可能发生在每个子节点被访问两次之前,因此上述异常无法通过原有逻辑解释
核心疑问与求助
我猜测OpenCL 1.2中,即使写入是原子操作,不同工作组对同一全局内存的读取也仅具有最终一致性保证,这个判断是否正确?如果正确,有什么解决办法?
进一步的疑问:
- OpenCL 1.2的宽松一致性内存模型是否也适用于原子写入?
- 能否确保原子写入后的读取操作不会读到过期值?
- 原子递增本身包含读取操作,理论上必然能与之前的原子写入同步(否则原子操作的正确性保证就不成立了),那跨工作组的读取操作为何无法同步?
内容的提问来源于stack exchange,提问作者Danimator
相关产品推荐
相关产品推荐

