我有一个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;\
}";
cell_s,cell_n,cell_e,cell_w表示2D模板的4个值。我计算new_value并在"barrier(CLK_GLOBAL_MEM_FENCE)"
之后更新它。
但是,似乎不同的工作项之间存在冲突。我怎么能解决这个问题?
答案 0 :(得分:2)
您使用的屏障GLOBAL_MEM_FENCE将不按预期同步所有工作项。它只与一个工作组同步访问。
通常所有工作组不会同时执行,因为它们仅在少量物理内核上进行调度,并且在内核中无法进行全局同步。
解决方案是将输出写入不同的缓冲区。