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

任何输入为什么会出现此行为将不胜感激。

最佳答案

我认为索引应该是这样的

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

关于c++ - OpenCL:壁垒调用后__local数组的值丢失,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47970865/

10-12 06:21