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

Kernel OpenCL内核增量返回错误的值,为什么?,kernel,opencl,increment,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,该值将保持不变。知道为什么会这

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

__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_索引任何元素的任何其他更改(交换等)都会导致错误的输出


pivot_索引缓冲区是使用CL_MEM_READ_WRITE标志创建的。

您说过您使用的是大小为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;
}

您说过您正在使用大小为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;
}

尝试将gid添加到该值,而不是1.f。为了检查在2D线程阵列上执行的内核是否与[11024,1]nRange settingI类似,我正在启动本地大小为16x16、全局大小为1024x1024的2D内核。一旦我切换回本地大小为1、全局大小为1024的1D内核启动,它就可以正常工作了。为了检查在2D线程阵列上执行的内核是否与[11024,1]nRange settingI类似,我正在启动本地大小为16x16、全局大小为1024x1024的2D内核。当我切换回本地大小为1、全局大小为1024的1D内核启动时,它工作得很好。谢谢黑暗零。事实就是这样。因为我是GPU编程新手,所以我没有注意到工作项的组织。谢谢你们。事实就是这样。因为我是GPU编程新手,所以我没有注意工作项的组织。