如何在OpenCL中的工作组中添加工作项的结果?

时间:2014-05-11 19:50:14

标签: opencl gpgpu

我使用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 ...有没有办法获得这个功能?一般来说,我需要工作组中每个工作项的结果总和。

编辑:似乎必须说,我想在没有原子的情况下解决这个问题。

2 个答案:

答案 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];
  }
}