【发布时间】:2018-07-08 03:14:06
【问题描述】:
我正在使用全局原子在 OpenCL 中的工作组之间进行同步。
所以内核使用类似的代码
... global volatile uint* counter;
if(get_local_id(0) == 0) {
while(*counter != expected_value);
}
barrier(0);
等到counter
变成expected_value
。
在另一个地方确实如此
if(get_local_id(0) == 0) atomic_inc(counter);
理论上,如果所有工作组同时运行,该算法应该始终有效。但是如果一个工作组在另一个工作组完全完成后才开始,那么内核可能会死锁。
在 CPU 和 GPU(NVidia CUDA 平台)上,它似乎总是可以工作,有大量的工作组(超过 8000 个)。
对于算法,这似乎是最有效的实现。 (它对 2D 缓冲区中的每一行进行前缀求和。)
OpenCL 和/或 NVidia 的 OpenCL 实施是否保证这始终有效?
【问题讨论】:
-
counter
已经是volatile
(atomic_inc
需要),因此不需要围栏 -
在 OpenCL 1.2 中似乎没有
atomic_load