如何使用CUDA从数组中有效地删除零值。有关零值数量的信息是预先提供的,应该可以简化此任务。
重要的是,数字应与源数组中的数字保持顺序,复制到结果数组时。
示例:
该数组例如包含以下值:[0,0,19,7,0,3,5,0,0,1]还有5个值为零的附加信息。所需的最终结果将是另一个包含以下内容的数组:[19,7,3,5,1]
要从数组中消除某些元素,可以使用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
如果您不想使用Thrust,而更喜欢使用CUDA,最好的方法是运行Sum Scan,在此处进行详细说明
关于奇偶合并排序的变体或实际上任何排序算法由a < b === (a != 0 && b == 0)
定义排序的情况如何?