我很难理解使用线程进行并行基数排序的概念。
如果我们使用最高有效数字方法,我们可以从创建存储桶1到9开始,然后使用他们的MSD将数字划分到存储桶中。
你可以通过每个桶有1个线程来并行排序。
但是,如果我们必须使用给定数量的处理器(例如4),那么如何将这9个存储桶分成四个处理器?
我在网上看到的图表似乎建议您首先将数字划分为x个处理器的x个分区(不进行任何排序),然后每个处理器对其给定分区的所有数字进行排序。但是你会留下x编号桶,每个桶都按自己排序,但不是整个矢量/数组排序,我不知道你接下来要做什么。
答案 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)(您可以转换为将元素拆分为字段)。