gpt4 book ai didi

c++ - OpenCL 内核 _local 内存行为不正确

转载 作者:行者123 更新时间:2023-11-30 02:30:39 25 4
gpt4 key购买 nike

我这里有一个测试内核,我从 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)

我想不通的是这返回一个 vector [1.0,1.0],而它似乎应该返回 vector [2.0,2.0]。因为基本上我有 4 个工作项分成两个工作组(每个工作组包含 2 个工作项)。

为每个工作组实例化一个局部 float x,每个工作组中的第一个工作项将其设置为0。然后工作组中的每个工作项将1加到它,并且由于每个工作组中有两个工作项,它应该是 2,但是当我返回 C 时,我得到的是一个 vector 。

最佳答案

barrier(CLK_LOCAL_MEM_FENCE);

x += 1.0f;

barrier(CLK_LOCAL_MEM_FENCE);

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

您将不得不使用原子或重新设计您的代码。

关于c++ - OpenCL 内核 _local 内存行为不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38388373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com