哪种并行排序算法具有最佳的平均案例性能?


134

在串行情况下,排序需要O(n log n)。如果我们有O(n)个处理器,我们希望线性加速。存在O(log n)个并行算法,但是它们具有很高的常数。它们也不适用于没有O(n)处理器的商品硬件。对于p个处理器,合理的算法应花费O(n / p log n)时间。

在串行情况下,快速排序平均具有最佳的运行时复杂性。并行快速排序算法很容易实现(请参阅此处此处)。但是,由于最初的步骤是将整个集合分区在单个内核上,因此执行效果不佳。我已经找到了许多并行排序算法的信息,但到目前为止,我还没有发现任何指向明确赢家的信息。

我希望以运行8到32个内核的JVM语言对100万到1亿个元素的列表进行排序。


@Jon真的。它们将是我的域对象,它们都是不同的,但是都实现了Comparable。
Craig P. Motlin

1
我认为您的“
应收帐单

@Sparr我不这么认为。我在区分几个处理器和与要排序的元素一样多的处理器之间进行区分。
Craig P. Motlin 2012年

@ CraigP.Motlin是正确的,但是您似乎错误地“分发了” / p。/ p应该只有一个。
Sparr 2012年

@Sparr啊,改变了,谢谢。
Craig P. Motlin

Answers:


204

以下文章(PDF下载)是对各种体系结构上的并行排序算法的比较研究:

各种架构上的并行排序算法

根据这篇文章,样本排序似乎在许多并行体系结构类型上都是最好的。

更新以解决Mark对年龄的关注:

以下是一些较新的文章,介绍了一些更新颖的内容(从2007年开始,顺便说一下,仍然可以与样本排序进行比较):

样品分类 AA-排序的改进

前沿(大约在2010年,有些才几个月):

并行排序模式
基于多核GPU的并行排序
混合CPU / GPU并行排序
带有实验研究的随机并行排序算法使用自然顺序对N元素进行
高度可扩展的并行排序
排序:一种新的自适应排序方法

2013年更新: 这是大约在2013年1月的前沿。(注意:一些链接是Citeseer上的论文,需要免费注册):

大学讲座:
用于选择和排序的并行分区
并行排序算法讲座
并行排序算法讲座2
并行排序算法讲座3

其他来源和论文:
基于自适应双音排序的多核体系结构的新颖排序算法
高度可扩展的并行排序2
并行合并
并行合并对象的2个
并行自排序系统
顺序快速排序和并行快速排序算法的性能比较
独立和群集SMP的共享内存,消息传递和混合合并排序
各种并行算法(排序等),包括实现

GPU和CPU / GPU混合来源和论文: 使用图形处理单元
对GPU体系结构
数据进行并行排序算法的OpenCL并行排序算法在GPU
上进行
高效排序的算法为许多核心GPU 设计有效的排序算法对GPU进行
确定性样本排序使用GPU进行
快速就地排序基于双比特排序的CUDA
使用混合算法的
快速并行GPU
排序在GPU 上的快速并行排序算法在CPU和GPU 上的快速排序:带宽不考虑SIMD排序的情况
GPU样本排序
GPU-ABiSort:流架构上的最佳并行排序
GPUTeraSort:高用于大型数据库管理的性能图形协处理器排序
多核GPU上基于高性能基于比较的排序算法,
具有负载平衡和低传输开销的支持CUDA的GPU的并行外部
排序在GPU上针对大型数据集的排序:彻底的比较


2
这是1996年对各种体系结构上的并行排序算法的比较研究。此后,并行计算发生了很多变化。
高性能Mark

1
看来您错过了IMHO最好的东西,即多核SIMD架构中排序的有效实现。从英特尔公司的研究,在2008年VLDB提交
alecco

1
一次,这将是一个很好的答案。现在,大多数链接已断开。
蒂姆·隆

6

我同时使用了并行快速排序算法和PSRS算法,该算法本质上将快速排序与合并相结合。

使用Parallel Quicksort算法,我已经演示了多达4个核(具有超线程的双核)的近乎线性的加速,鉴于算法的局限性,这是可以预期的。纯Parallel Quicksort依赖共享的堆栈资源,这将导致线程之间的争用,从而降低任何性能提升。该算法的优势在于它可以“就地”排序,从而减少了所需的内存量。如您所述,当向上排序100M个元素时,您可能需要考虑这一点。

我看到您正在寻找在具有8-32核的系统上进行排序的方法。PSRS算法避免了在共享资源上的争用,从而可以加快进程数。我已经展示了多达4个内核的算法,但是其他人的实验结果却表明,线性加速几乎达到32个内核,甚至更多。PSRS算法的缺点是它不就位,并且需要更多的内存。

如果您有兴趣,可以对每种算法使用或仔细阅读我的Java代码。您可以在github上找到它:https : //github.com/broadbear/sort。该代码旨在替代Java Collections.sort()。如果如上所述,您正在寻找在JVM中执行并行排序的功能,我的存储库中的代码可能会帮助您。该API完全针对实现Comparable或实现自己的Comparator的元素进行了通用。

请问您要对这么多元素进行排序吗?我很想知道我的排序包的潜在应用程序。


我有一个8核处理器。:)现在我已经测试了向上排序40M元素。我没有看到线性加速,但是看到了比标准Java 8 Collections排序算法(据说是多线程Timsort)可观的性能提升。我的PSRS实现对4千万个元素的平均排序时间为4985毫秒,而默认的JDK排序算法为19759毫秒。
broadbear


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.