我在从不同线程读取双数组中的几个位置时遇到问题。
我将执行命名为:
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;输出数组的最后一个位置)
任何人都知道我做错了什么,或者我可以看到什么?
非常感谢,
安东
答案 0 :(得分:2)
在内核中,全局内存一致性只能在单个工作组中实现 。这意味着如果工作项将值写入全局内存,barrier(CLK_GLOBAL_MEM_FENCE)
仅保证同一工作组中的其他工作项将能够读取更新的值。
如果您需要跨多个工作组的全局内存一致性,则需要将内核拆分为多个内核。