在不同线程上读取相同的mem位置时出错

时间:2015-10-22 09:40:30

标签: multithreading opencl

我在从不同线程读取双数组中的几个位置时遇到问题。

我将执行命名为:

nelements = nx*ny;
err = clEnqueueNDRangeKernel(queue,kernelTvl2of,1,NULL,&nelements,NULL,0,NULL,NULL);

kernelTvl2of有(以及其他)代码

size_t k = get_global_id(0);
(...)
u1_[k] = (float)u1[k];
(...)
barrier(CLK_GLOBAL_MEM_FENCE);
forwardgradient(u1_,u1x,u1y,k,nx,ny);
barrier(CLK_GLOBAL_MEM_FENCE);

和forwardgradient有代码:

void forwardgradient(global double *f, global double *fx, global double *fy, int ker,int nx, int ny){
unsigned int rowsnotlast = ((nx)*(ny-1));
if(ker<rowsnotlast){
 fx[ker] = f[ker+1] - f[ker];
 fy[ker] = f[ker+nx] - f[ker];
}
if(ker<nx*ny){
 fx[ker] = f[ker+1] - f[ker];
 if(ker==4607){
  fx[0] = f[4607];
  fx[1] = f[4608];
  fx[2] = f[4608] - f[4607];
  fx[3] = f[ker];
  fx[4] = f[ker+1];
  fx[5] = f[ker+1] - f[ker];
 }
}
if(ker==(nx*ny)-1){
 fx[ker] = 0;
 fy[ker] = 0;
}
if(ker%nx == nx-1){
 fx[ker]=0;
}
fx[6] = f[4608];
}

当我得到fx的第一个位置的内容时,它们是:

-6 0 6 -6 0 6 -6

这就是我的问题:当我在ID为4607的线程上查询fx [ker + 1]或fx [4608]时,我得到了一个&#39; 0&#39; (定位输出数组的第二个和第五个),但是从其他线程我得到了一个&#39; -6&#39;输出数组的最后一个位置)

任何人都知道我做错了什么,或者我可以看到什么?

非常感谢,

安东

1 个答案:

答案 0 :(得分:2)

在内核中,全局内存一致性只能在单个工作组中实现 。这意味着如果工作项将值写入全局内存,barrier(CLK_GLOBAL_MEM_FENCE)仅保证同一工作组中的其他工作项将能够读取更新的值。

如果您需要跨多个工作组的全局内存一致性,则需要将内核拆分为多个内核。