在OpenCL中的atom_inc之后从__global内存中读取的麻烦

时间:2010-09-29 22:00:05

标签: memory opencl

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

全局内存是否在本地缓存?这是怎么回事?

1 个答案:

答案 0 :(得分:0)

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

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

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