【问题标题】:Groupby reduction in OpenCL?OpenCL中的Groupby减少?
【发布时间】:2012-08-08 21:24:53
【问题描述】:

我想在 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;

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

【问题讨论】:

  • 您是否考虑过尝试类似于 Thrust 的 zip iterators 的东西? Thrust 不支持 OpenCL,但您可以从他们的 CUDA 代码中获得灵感。 Zip 迭代器允许多个输出序列类似于您感兴趣的内容。
  • IIUC zip 迭代器仅提供了一种执行方式,例如使用 n 元组数据集进行归约,但归约仍然只会产生一个 n 元组,而不是 n 元组的数组/列表。

标签: parallel-processing mapreduce opencl reduce


【解决方案1】:

散列的解决方案

阶段 1) 可以使用散列方案将组值散列到某个位置,然后原子加法可以将第二个值的内容相加。

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

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

排序解决方案

第一阶段)对分组值上的数据进行排序

第 2 阶段)使用归约法对每个组求和

第 3 阶段)用于压缩和的前缀和扫描

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-03
    • 2021-12-02
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多