Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 哪种并行排序算法具有最佳的平均案例性能?_Algorithm_Sorting_Concurrency - Fatal编程技术网

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

Algorithm 哪种并行排序算法具有最佳的平均案例性能?,algorithm,sorting,concurrency,Algorithm,Sorting,Concurrency,在串行情况下,排序采用O(n logn)。如果我们有O(n)处理器,我们希望线性加速。O(logn)并行算法存在,但它们有一个非常高的常数。它们也不适用于没有接近O(n)处理器的商品硬件。对于p处理器,合理的算法应该花费O(n/p logn)时间 在串行情况下,快速排序平均具有最佳的运行时复杂性。并行快速排序算法易于实现(请参阅和)。但是,它的性能并不好,因为第一步是将整个集合划分到单个核心上。我已经找到了许多并行排序算法的信息,但到目前为止,我还没有看到任何明确的胜利者 我希望用运行在8到32

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

在串行情况下,快速排序平均具有最佳的运行时复杂性。并行快速排序算法易于实现(请参阅和)。但是,它的性能并不好,因为第一步是将整个集合划分到单个核心上。我已经找到了许多并行排序算法的信息,但到目前为止,我还没有看到任何明确的胜利者

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

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

根据这篇文章,示例排序似乎是许多并行体系结构类型的最佳选择

更新内容以解决Mark对年龄的担忧:

这里有一些最近的文章介绍了一些更新颖的东西(从2007年开始,顺便说一句,它仍然可以与示例排序进行比较):


最前沿(大约2010年,一些只有几个月的历史):







2013年更新: 这是2013年1月左右的最新进展。(注意:一些链接指向Citeser的论文,需要免费注册):

大学讲座:





其他来源和文件:









GPU和CPU/GPU混合源和论文:
















这篇论文可能是你的好起点。

看看这篇论文:。它涉及32个以上的核。但是,它详细描述了一种算法,其运行时间复杂度为O(n/p*log(n)+p*log(n)**2),适用于任意比较器。

我使用过并行快速排序算法和基本上将快速排序与合并结合在一起的PSRS算法

对于并行快速排序算法,我已经演示了接近线性的加速,最多有4个内核(双核超线程),这是由于该算法的局限性所期望的。纯并行快速排序依赖于共享堆栈资源,这将导致线程之间的争用,从而降低性能上的任何增益。这种算法的优点是它“就地”排序,从而减少了所需的内存量。你可能想在你所说的排序100米以上时考虑这一点。 我知道您希望在8-32核的系统上进行排序。PSRS算法避免了共享资源上的争用,允许在更高数量的进程上加速。如上所述,我已经演示了最多4个核的算法,但其他人的实验结果报告了接近线性的加速比,核数更大,超过32个。PSRS算法的缺点是它不到位,需要相当多的内存

如果您感兴趣,您可以使用或仔细阅读我的Java代码中的每一种算法。您可以在github上找到它:。该代码旨在作为Java Collections.sort()的替代品。如果您正在寻找如上所述在JVM中执行并行排序的能力,my repo中的代码可能会对您有所帮助。对于实现Comparable或实现您自己的Comparator的元素,API是完全通用的


我可以问一下,您希望对这么多元素进行排序是为了什么吗?我很想知道我的排序包的潜在应用。

这是对1996年各种体系结构上并行排序算法的比较研究。从那时起,并行计算发生了很大的变化。您似乎错过了在多核SIMD体系结构中最有效的排序实现。来自英特尔研究院,在VLDB 2008上发表。这将是一个很好的答案。现在,大多数链接都断了。我想你的“应该服用”中的n/p太多了@spar我不这么认为。我在区分有几个处理器和有尽可能多的处理器作为被排序的元素。@CraigP.Motlin对,但是您似乎错误地“分配”了/p。应该只有一个/p。@Sparr啊,改了,谢谢。@CraigP.Motlin我想你拿错了:)我有一个8核处理器。:)现在我已经测试了4000万个元素的排序。我并没有看到线性加速,但我看到了相对于标准Java8集合排序算法的巨大性能提升,该算法被认为是一种多线程的Timsort。我的PSRS实现以平均4985毫秒的速度对4000万个元素进行排序,而默认的JDK排序算法为19759毫秒。