OpenCL:屏障调用后__local数组的值丢失

问题描述 投票:1回答:1

我有一个内核将一些部分结果存储在本地数组中,然后将它们减少为单个值(参见下面的示例)。在还原过程开始之前,会设置一个屏障以确保所有线程都已成功写入其部分数据。但是,屏障将临时数组的值重置为默认值(即浮点数为0.0f)。

最小的例子:

__kernel void simulate_plate(__local float *partial)
{
    __private int lpos;

    lpos = get_local_id(0) + get_local_id(1) * get_local_size(1);

    partial[lpos] = 1;
    barrier(CLK_LOCAL_MEM_FENCE);
    // At this point partial[i] == 0 for all i

    // reduce data...
}

参数partial具有以下初始值设定项:

clSetKernelArg(kernel, 0, local_group_size * sizeof(float), NULL);

clSetKernelArg()调用返回状态代码CL_SUCCESS,内核终止,没有任何错误。

另一个观察是交换线partial[lpos] = 1barrier(CLK_LOCAL_MEM_FENCE)实现了想要的结果---数组partial的所有组件现在等于1。

任何输入为什么会出现这种行为将非常感激。

c++ c opencl
1个回答
2
投票

我认为指数应该是这样的

lpos = get_local_id(0)+ get_local_id(1)* get_local_size(0);

© www.soinside.com 2019 - 2024. All rights reserved.