使用提供的线程数进行并行基数排序

时间:2016-10-29 01:03:53

标签: c++ multithreading sorting parallel-processing

我很难理解使用线程进行并行基数排序的概念。

如果我们使用最高有效数字方法,我们可以从创建存储桶1到9开始,然后使用他们的MSD将数字划分到存储桶中。

你可以通过每个桶有1个线程来并行排序。

但是,如果我们必须使用给定数量的处理器(例如4),那么如何将这9个存储桶分成四个处理器?

我在网上看到的图表似乎建议您首先将数字划分为x个处理器的x个分区(不进行任何排序),然后每个处理器对其给定分区的所有数字进行排序。但是你会留下x编号桶,每个桶都按自己排序,但不是整个矢量/数组排序,我不知道你接下来要做什么。

1 个答案:

答案 0 :(得分:0)

对x分区进行排序后,您将合并x分区。这可以通过执行2路合并的log2(x)传递或执行x路合并的单个传递来完成。 x way merge通常使用堆来加速确定哪个x元素(以及元素属于哪个分区)是最小的。除了初始化之外,元素一次一个地从堆中删除并添加到堆中。最终到达其中一个x分区的末尾,并且合并变为x-1合并。最后只剩下一个分区,并将其复制到输出数组中。

如果阵列太大以至于它的分区比核心特定的L1和L2缓存大得多,则并行基数排序对冲突没有多大帮助,因为所有核心共享公共L3(和L4,如果存在)缓存和主记忆。例如,每个核心的L1缓存可能是32KB,每个核心的L2缓存可能是256KB。

另一种方法是将数组拆分为z 256KB分区,然后对z分区一次执行x radix排序。最后一步是z排序的256KB分区的z方式合并。

对于基数排序,您可能希望将基数256用于8位字段(而不是使用基数10)(您可以转换为将元素拆分为字段)。