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

div*_*182 7 c++ arrays cuda thrust

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

在复制到结果数组时,数字在源数组中保持有序排列非常重要.


例:

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

pho*_*oad 7

要从数组中删除某些元素,您可以使用Thrust Library的压缩操作.给定一个谓词is_not_zero,它返回false零值,true对于其他谓词,你可以写这样的操作

thrust::copy_if(in_array, in_array + size, out_array, is_not_zero);
Run Code Online (Sandbox Code Playgroud)

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

您也可以将"remove_if"函数与反向谓词一起使用,该反向谓词返回true零,false对于其他人.

thrust::remove_if(in_array, in_array + size, is_zero);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 有类似的库和压缩的内核实现.您可能不需要仅使用Thrust这个功能,我建议你使用它.只需看看CUDA SDK的示例. (2认同)