如何使用CUDA并行地从数组中有效地删除零值。 有关零值数量的信息可提前获得, 这应该简化这项任务。
重要的是数字在源数组中保持有序, 当被复制到结果数组时。
示例:
阵列将是例如包含以下值: [0,0,19,7,0,3,5,0,0,1] 以及5个值为零的附加信息。 然后,期望的最终结果将是包含以下内容的另一个 [19,7,3,5,1]
答案 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)
定义?