OpenCL内核增量返回错误的值,为什么?

时间:2016-09-07 17:53:24

标签: kernel opencl increment

我试图在全局缓冲区中增加某个值的值。让我给你骨架。

__kernel void relax_a_point(__global float* pivot_indices)
{
        int gid = get_global_id(0);
        pivot_indices[gid * 8 + 2] = pivot_indices[gid * 8 + 2] + 1.f;
}

不是将值增加1,而是将值增加1024/1023/1022。如果我添加0.f,则值保持不变。知道为什么会这样吗?对pivot_indices的任何元素(交换等)的任何其他更改都会导致输出错误。

pivot_indices缓冲区是使用CL_MEM_READ_WRITE标志创建的。

1 个答案:

答案 0 :(得分:2)

你说你使用的是尺寸为1024x1024的2D内核,但是在:

int gid = get_global_id(0);

工作项ID仅基于全局维度0.这意味着,1024个工作项共享相同的gid

1024/1023/1022随机结果是工作项之间的简单数据访问比赛,因为它们之间没有同步。导致在比赛过程中失去一些额外的东西。

你应该这样做:

__kernel void relax_a_point(__global float* pivot_indices)
{
        int gid = get_global_id(0) + get_global_id(1)*get_global_size(0);
        pivot_indices[gid * 8 + 2] = pivot_indices[gid * 8 + 2] + 1.f;
}