代码之家  ›  专栏  ›  技术社区  ›  Steve Blackwell

OpenCL中atom_inc.之后读取全局内存时出现问题

  •  0
  • Steve Blackwell  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  0
  •   Steve Blackwell    15 年前

    发现问题:工作组的执行顺序是实现定义的。这意味着某些线程可能只启动 其他人已经完成了。

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

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