如何并行删除数组中的零值

时间:2012-09-17 16:42:56

标签: c++ arrays cuda thrust

如何使用CUDA并行地从数组中有效地删除零值。 有关零值数量的信息可提前获得, 这应该简化这项任务。

重要的是数字在源数组中保持有序, 当被复制到结果数组时。


示例:

阵列将是例如包含以下值: [0,0,19,7,0,3,5,0,0,1] 以及5个值为零的附加信息。 然后,期望的最终结果将是包含以下内容的另一个 [19,7,3,5,1]

3 个答案:

答案 0 :(得分:7)

要从数组中删除某些元素,您可以使用Thrust Library's compaction operations。给定谓词is_not_zero,其中false返回零值,true返回其他值,您可以像这样编写操作

thrust::copy_if(in_array, in_array + size, out_array, is_not_zero);

输出数组将仅包含非零值,因为谓词表示如此。

您也可以将“remove_if”函数与反向谓词一起使用,该谓词返回true为零,false为其他人。

thrust::remove_if(in_array, in_array + size, is_zero);

我建议你看一下Thrust库的压缩例子,或者一般的压缩概念。

http://code.google.com/p/thrust/source/browse/examples/stream_compaction.cu

答案 1 :(得分:1)

如果您不想使用Thrust并且您更喜欢使用CUDA,那么最好的办法就是运行Sum Scan,这里有详细介绍

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter36.html

答案 2 :(得分:0)

奇偶合并排序的变体怎么样,或者实际上任何排序算法,其中排序由a < b === (a != 0 && b == 0)定义?