Parallel processing OpenCL中的Groupby缩减?

Parallel processing OpenCL中的Groupby缩减?,parallel-processing,mapreduce,opencl,reduce,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]; }

我想在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;
int data[n][2],result[n][2],result\u count=-1,
新增=0,组=数据[0][0];
对于(int i=0;i
我所知道的唯一朝这个方向发展的标准算法是并行归约;但是,它减少到一个数字,而不是一组附加值的缓冲区。我不确定并行缩减是否可以与动态结果缓冲区(例如,在本地内存中)一起工作,并且在性能方面仍然是有效的。

哈希解决方案

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

阶段2)前缀和扫描算法通过哈希表进行压缩

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

排序法

阶段1)对组值上的数据进行排序

第2阶段)使用缩减法对每组进行求和


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

您是否考虑过尝试类似于推力的方法?推力没有OpenCL的支持,但你可以从他们的CUDA代码中获得灵感。Zip迭代器允许使用与您感兴趣的内容类似的多个输出序列。IIUC Zip迭代器仅提供了一种方法,例如使用n元组数据集执行约简,但reduce仍然只生成一个n元组,而不会生成n元组的数组/列表。