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

时间:2017-12-25 17:51:44

标签: c++ c opencl

我有一个内核在减少之前将一些部分结果存储在本地数组中 将它们分成单个值(参见下面的例子)。在还原过程之前 启动时,会设置一个屏障以确保所有线程都已成功写入 部分数据。但是,屏障会将临时数组的值重置为 默认值(即浮点数为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。

为什么会出现这种情况的任何输入都将非常感激。

1 个答案:

答案 0 :(得分:2)

我认为索引应该是这样的

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