8

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

重要的是,在将数字复制到结果数组时,数字保持与源数组中一样的顺序。


例子:

该数组将例如包含以下值: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] 以及 5 个值为零的附加信息。然后,所需的最终结果将是另一个数组,其中包含: [19, 7, 3, 5, 1]

4

3 回答 3

7

要从数组中删除某些元素,您可以使用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

于 2012-09-17T19:33:06.037 回答
1

如果您不想使用 Thrust 而更喜欢使用 CUDA,那么最好的办法可能是运行 Sum Scan,这里有详细描述

https://developer.nvidia.com/gpugems/gpugems2/part-iv-general-purpose-computation-gpus-primer/chapter-36-stream-reduction

于 2013-06-09T22:14:32.777 回答
0

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

于 2012-09-17T19:45:43.107 回答