使用指定数量的线程进行并行基数排序

Parallel radix sort using a provided number of threads

本文关键字:线程 并行 基数排序      更新时间:2023-10-16

我在理解使用线程的并行基数排序的概念时遇到了一些困难。

如果我们使用最高有效数字方法,我们可以从创建桶1到9开始,并使用它们的MSD将数字分成桶。

您可以通过每个bucket有一个线程来并行排序。

然而,如果我们必须使用给定数量的处理器,例如4,您将如何将这9个桶分成4个处理器?

我在网上看到的一个图表似乎表明,您应该首先将数字划分为x个处理器的x个分区(不做任何排序),然后每个处理器对其给定分区的所有数字进行排序。但你会得到x个数字桶,每个数字桶各自排序,但不是整个数字向量/数组排序,我不确定你接下来会做什么。

在对x分区进行排序之后,您将合并x分区。这可以通过log2(x)次进行2向归并,也可以通过单次进行x向归并。x方式合并通常使用堆来加速确定x个元素(以及元素所属的分区)中哪个最小。除了初始化之外,每次只从堆中移除一个元素并将其添加到堆中。最终到达x个分区之一的终点,合并就变成了x-1合并。最后只剩下一个分区,并将其复制到输出数组中。

如果数组太大,它的分区比内核特定的L1和L2缓存大得多,由于冲突,并行基数排序不会有太大帮助,因为所有内核共享公共L3(如果存在的话,还有L4)缓存和主存。例如,每个核心的L1缓存可能是32KB,每个核心的L2缓存可能是256KB。

另一种方法是将数组分成z个256KB的分区,然后对z个分区一次执行x个基数排序。最后一步是对z排序的256KB分区进行z向合并。

对于基数排序,您可能希望对8位字段使用进制256而不是进制10(您可以通过移位而不是分割来将元素拆分为多个字段)。