0

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] 读取的值一旦被读取就永远不会改变线程,并且它会永远循环。我知道它正在递增,因为当我将它读回主机时它是正确的值。

全局内存是否在本地缓存?这里发生了什么?

4

1 回答 1

0

发现问题:工作组的执行顺序是实现定义的。这意味着某些线程可能仅其他线程完成后才开始。

在我给出的代码中,首先启动的工作组将永远循环等待其他人击中“障碍”。稍后开始的工作组将永远不会开始,因为他们正在等待第一个工作组完成。

如果实现(我在 Radeon 5750 上,使用 Stream SDK 2.2)同时执行所有工作组,那么它可能不会成为问题。但我的设置并非如此。

于 2010-09-30T18:34:22.650 回答