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