Groupby减少OpenCL?

时间:2012-08-08 21:24:54

标签: parallel-processing mapreduce opencl reduce

我想在OpenCL中实现groupby减少。例如,输入

a1 a2 a3 b1 b2 c3 c4

会产生

a6 b3 c7

C伪代码如下所示:

int data[n][2], result[n][2], result_count = -1, 
    added = 0, group = data[0][0];
for (int i = 0; i < n; i++) { 
  if (group == data[i][0]) {
    added += data[i][1];
  } else {
    result[++result_count][0] = group;
    result[result_count][1] = added;
    group = data[i][0];
    added = 0;
  }
} 
return result, result_count;

我所知道的唯一标准算法是平行减少;但是,它减少到一个数字而不是按组添加值的缓冲区。我不确定并行缩减是否可以用于动态结果缓冲区(例如在本地存储器中)并且在性能方面仍然有效。

1 个答案:

答案 0 :(得分:1)

Hashing的解决方案

阶段1)散列方案可用于将组值散列到某个位置,然后原子添加可以对第二个值的内容求和。

阶段2)前缀和扫描算法通过哈希表来压缩它。

阶段3)可选择对结果进行排序

排序

的解决方案

阶段1)对组值

上的数据进行排序

阶段2)使用减少量对每个组进行求和

阶段3)前缀和扫描以压缩总和