2012-08-08 43 views
0

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

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; 

唯一标准算法我知道它出现在此方向平行减少;然而,它减少到一个数字,而不是按组来增加值的缓冲区。我不确定并行压缩是否可以与动态结果缓冲区一起工作(例如在本地内存中),并且在性能方面仍然很有效。

+0

您是否考虑尝试类似于Thrust的[zip迭代器](http://code.google.com/p/thrust /维基/ QuickStartGuide#zip_iterator)? Thrust没有OpenCL支持,但你可以从他们的CUDA代码中获得灵感。 Zip迭代器允许多个输出序列与您感兴趣的类似。 – limes 2012-08-09 18:26:20

+0

IIUC zip迭代器仅提供一种执行使用n元组数据集的减少,但减少仍然会产生只有一个n元组而不是n元组的数组/列表。 – 2012-08-10 00:00:55

回答

1

通过散列

阶段1中的溶液)哈希方案可以用于该组值散列到一个位置,然后一个原子添加可以总结第二个值的内容。

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

阶段3)的结果

任选地排序排序

阶段1)分类在组值

阶段2)的数据使用的减少来总结每个组

的溶液

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