我在这里有一个测试内核,我从Julia OpenCL API调用。我从Julia调用它的事实并不重要,这正是我用来运行OpenCL的原因,下面是代码:
using OpenCL
const cl = OpenCL
device, ctx, queue = cl.create_compute_context()
C_buff = cl.Buffer(Float32, ctx, :w, 2)
const testkernel = """
kernel void test(global float *C)
{
int gid = get_global_id(0);
int lid = get_local_id(0);
local float x;
if (lid == 0)
{
x = 0.0f;
}
barrier(CLK_LOCAL_MEM_FENCE);
x += 1.0f;
barrier(CLK_LOCAL_MEM_FENCE);
if (lid == 0)
{
C[gid / 2] = x;
}
}
"""
program = cl.Program(ctx, source=testkernel) |> cl.build!
kernel = cl.Kernel(program, "test")
cl.call(queue, kernel, 4, 2, C_buff)
cl.read(queue, C_buff)
我无法弄清楚这是否会返回一个向量[1.0,1.0]
,而它似乎应该返回向量[2.0,2.0]
。基本上我有4个工作项分为两个工作组(每个工作组包含2个工作项)。
为每个工作组实例化一个本地浮点x
,并且每个工作组中的第一个工作项将其设置为0.然后,工作组中的每个工作项都将其添加1,并且因为每个工作组中有两个工作项,所以它应该是2,但是当我返回C
时,我会得到一个工具项。
答案 0 :(得分:3)
barrier(CLK_LOCAL_MEM_FENCE); x += 1.0f; barrier(CLK_LOCAL_MEM_FENCE);
障碍不是互斥体。您有一个数据竞争,其中两个工作项都试图同时写入同一个变量。
您必须使用原子或重新设计代码。