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