如何使用 CUDA 有效地从数组中并行删除零值。有关零值数量的信息可以提前获得,这应该可以简化此任务。
重要的是,在将数字复制到结果数组时,数字保持与源数组中一样的顺序。
例子:
该数组将例如包含以下值: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] 以及 5 个值为零的附加信息。然后,所需的最终结果将是另一个数组,其中包含: [19, 7, 3, 5, 1]
要从数组中删除某些元素,您可以使用Thrust Library 的重新排序操作。给定一个 predicate 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 库的压缩示例,或者一般压缩概念。
https://github.com/thrust/thrust/blob/master/examples/stream_compaction.cu
如果您不想使用 Thrust 而更喜欢使用 CUDA,那么最好的办法可能是运行 Sum Scan,这里有详细描述
奇偶合并排序的变体,或者实际上任何排序算法,其中排序由 定义a < b === (a != 0 && b == 0)
?