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

问题描述 投票:8回答:3

如何使用CUDA从数组中有效地删除零值。有关零值数量的信息是预先提供的,应该可以简化此任务。

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


示例:

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

c++ arrays cuda thrust
3个回答
7
投票

要从数组中消除某些元素,可以使用Thrust Library's reordering 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库的压缩示例,或一般压缩概念。

https://github.com/thrust/thrust/blob/master/examples/stream_compaction.cu


1
投票

如果您不想使用Thrust,而更喜欢使用CUDA,最好的方法是运行Sum Scan,在此处进行详细说明


0
投票

关于奇偶合并排序的变体或实际上任何排序算法由a < b === (a != 0 && b == 0)定义排序的情况如何?

© www.soinside.com 2019 - 2024. All rights reserved.