OpenCL 没有会停止所有线程的全局屏障,因此我正在尝试使用以下代码创建一个解决方法:
void barrier(__global uint* scratch) {
uint nThreads = get_global_size(0);
atom_inc(scratch);
/* this loop never terminates */
while(scratch[0] < nThreads) {
continue;
}
}
这个想法是每个线程循环,直到它们都增加那一块内存。
但是,从头[0] 读取的值一旦被读取就永远不会改变线程,并且它会永远循环。我知道它正在递增,因为当我将它读回主机时它是正确的值。
全局内存是否在本地缓存?这里发生了什么?