我使用GlobalWorkSize 64 4 1
和WorkGroupSize 1 4 1
调用下面的内核,并将参数output
初始化为零。
__kernel void kernelB(__global unsigned int * output)
{
uint gid0 = get_global_id(0);
uint gid1 = get_global_id(1);
output[gid0] += gid1;
}
我希望6 6 6 6 ...
为gid1
'(0 + 1 + 2 + 3)的总和。相反,我得到3 3 3 3 ...
有没有办法获得这个功能?一般来说,我需要工作组中每个工作项的结果总和。
编辑:似乎必须说,我想在没有原子的情况下解决这个问题。
答案 0 :(得分:2)
多个工作项同时访问global
的元素,结果未定义。您需要使用原子操作或为每个工作项写入唯一的位置。
答案 1 :(得分:2)
您需要使用本地内存来存储所有工作项的输出。在完成工作项目的计算之后,您将结果与累积步骤相加。
__kernel void kernelB(__global unsigned int * output)
{
uint item_id = get_local_id(0);
uint group_id = get_group_id(0);
//memory size is hard-coded to the expected work group size for this example
local unsigned int result[4];
//the computation
result[item_id] = item_id % 3;
//wait for all items to write to result
barrier(CLK_LOCAL_MEM_FENCE);
//simple O(n) reduction using the first work item in the group
if(local_id == 0){
for(int i=1;i<4;i++){
result[0] += result[i];
}
output[group_id] = result[0];
}
}