OpenCL模具代码问题

OpenCL模具代码问题,opencl,stencils,Opencl,Stencils,我有一个4点模具OpenCL代码的问题。代码运行良好,但我没有得到预期的symetrics最终2D值 我怀疑这是内核代码中更新值的问题。以下是内核代码: // kernel code const char *source ="__kernel void line_compute(const double diagx, const double diagy,\ const double weightx, const double weighty, const int size_x,\ __

我有一个4点模具OpenCL代码的问题。代码运行良好,但我没有得到预期的symetrics最终2D值

我怀疑这是内核代码中更新值的问题。以下是内核代码:

// kernel code

const char *source ="__kernel void line_compute(const double diagx, const double diagy,\
const double weightx,  const double weighty,  const int size_x,\
 __global double* tab_new, __global double* r)\
{ int iy = get_global_id(0)+1;\
  int ix = get_global_id(1)+1;\
  double new_value, cell, cell_n, cell_s, cell_w, cell_e;\
  double rk;\
  cell_s = tab_new[(iy+1)*(size_x+2)+ix];\
  cell_n = tab_new[(iy-1)*(size_x+2)+ix];\
  cell_e = tab_new[iy*(size_x+2)+(ix+1)];\
  cell_w = tab_new[iy*(size_x+2)+(ix-1)];\
  cell     = tab_new[iy*(size_x+2)+ix];\
  new_value = weighty *( cell_n + cell_s + cell*diagy)+\
                      weightx *( cell_e + cell_w + cell*diagx);\
  rk = cell - new_value;\
  r[iy*(size_x+2)+ix] = rk *rk;\
  barrier(CLK_GLOBAL_MEM_FENCE);\
  tab_new[iy*(size_x+2)+ix] = new_value;\
}";
单元格s、单元格n、单元格e、单元格w表示二维模具的4个值。我计算新的值,并在
“屏障(CLK\U全局\U内存围栏)”后更新它


然而,不同的工作项之间似乎存在冲突。如何解决此问题?

您使用的屏障全局内存围栏不会按预期同步所有工作项。它只与一个工作组同步访问

通常,不会同时执行所有工作组,因为它们只调度在少量物理内核上,并且在内核中不可能进行全局同步

解决方案是将输出写入不同的缓冲区