我有一个内核在减少之前将一些部分结果存储在本地数组中 将它们分成单个值(参见下面的例子)。在还原过程之前 启动时,会设置一个屏障以确保所有线程都已成功写入 部分数据。但是,屏障会将临时数组的值重置为 默认值(即浮点数为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。
为什么会出现这种情况的任何输入都将非常感激。
答案 0 :(得分:2)
我认为索引应该是这样的
lpos = get_local_id(0)+ get_local_id(1)* get_local_size(0);