我只是想知道是否有任何有效的方法可以从M个元素中获取N个最大元素,其中N比使用GPU小得多(例如N = 10,M = 1000)。
问题是 - 由于输入数据的大小,我真的不想将数据从GPU传输到CPU然后将其恢复。但是,精确排序似乎不能很好地工作,因为线程发散和浪费在我们并不真正关心的排序元素上(在上面的例子中,DC元素是11~1000)。
答案 0 :(得分:1)
如果N足够小,N个最大值可以保存在共享内存中,那么将允许快速实现只读取全局内存中M个元素的数组,然后立即写出这N个最大值。如果N也不超过每个块的最大线程数,则实现变得更简单。
与串行编程相反,我不会使用堆(或其他更复杂的数据结构),而只是使用排序数组。 SM上有大量并行硬件,在遍历堆时会被闲置。整个线程块可用于移动共享内存阵列中小于新传入值的元素。
如果N <= 32,则可以使用warp shuffle functions保持寄存器中N个最大数字的排序列表的整洁解决方案。