Parallel Radix Sort

来源:互联网 发布:托福模考软件 编辑:程序博客网 时间:2024/06/03 22:06

感觉在GPU上面写排序差不多现在都是这个,不知道Keplar3.5出了Dynamic Parallel Thread之后会不会出现那种排序网络的排序算法更高效,反正现在就是这个了,Fermi就能跑的并行排序。


Radix Sort算是一种外排序吧,大家都了解了估计,首先要算定一个Radix的长度,然后根据Radix的长度对每个可能值进行统计数目,然后根据统计的数目进行Prefix Sum,之后把数放到另一个数组里,根据刚才统计的位置


这个并行算法分三个阶段,根据GPU Gems III Broad-Phase Detection里面讲的,他使用了16(Num_Block_Num)个线程块,每个线程块还分成了16(Num_Group_Num)个线程组,这主要是权衡排序所需要的趟数和寄存器有限,具体请见GPU Gems III Broad-Phase Detection里面的具体情况。


第一个阶段,由于每个线程块中的线程组共享同样的Shared_memory,所以每个线程组的访问是序列化进行的,如图:


32fig11.jpg



为了保证排序的稳定性,每个线程块依次处理连续的数据段,每个线程组也连续处理连续的数据块,这样就可以防止后面的数据出现在前方,这个是有之后的Prefix Sum决定的,后面讨论。


32fig12.jpg


32fig13.jpg


32fig14.jpg



线程组中的线程对分配到的数据段采取交织访问的方法,这样可以使用并行处理,提高效率,这样对内存寻址的公式可以写为:


711equ01.jpg


其中Num_Elements_Per_Group表示每个线程组分配到的数据的数量。



原创粉丝点击