2012-08-08 98 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)前綴總和掃描以壓縮總和