繁体   English   中英

OpenCL内核_本地内存行为不正常

[英]OpenCL Kernel _local memory not behaving correctly

我在这里有一个测试内核,我从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 ,我会得到一个向量。

 barrier(CLK_LOCAL_MEM_FENCE); x += 1.0f; barrier(CLK_LOCAL_MEM_FENCE); 

障碍不是互斥体。 您有一个数据竞争,其中两个工作项尝试同时写入同一个变量。

你必须使用原子或重新设计你的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM