如何使用CUDA从M个元素中获得N个最大元素,其中N <&lt; M&

时间:2016-08-10 22:27:16

标签: algorithm sorting cuda

我只是想知道是否有任何有效的方法可以从M个元素中获取N个最大元素,其中N比使用GPU小得多(例如N = 10,M = 1000)。

问题是 - 由于输入数据的大小,我真的不想将数据从GPU传输到CPU然后将其恢复。但是,精确排序似乎不能很好地工作,因为线程发散和浪费在我们并不真正关心的排序元素上(在上面的例子中,DC元素是11~1000)。

1 个答案:

答案 0 :(得分:1)

如果N足够小,N个最大值可以保存在共享内存中,那么将允许快速实现只读取全局内存中M个元素的数组,然后立即写出这N个最大值。如果N也不超过每个块的最大线程数,则实现变得更简单。

与串行编程相反,我不会使用堆(或其他更复杂的数据结构),而只是使用排序数组。 SM上有大量并行硬件,在遍历堆时会被闲置。整个线程块可用于移动共享内存阵列中小于新传入值的元素。

如果N <= 32,则可以使用warp shuffle functions保持寄存器中N个最大数字的排序列表的整洁解决方案。