【问题标题】:java - Fast parallel sort to put unsigned integers into order?java - 快速并行排序以将无符号整数排序?
【发布时间】:2012-03-20 14:55:46
【问题描述】:

我的任务是对大量无符号、64 位、随机生成的整数(超过 5E7 个元素)进行排序。您能否指导我使用至少在随机数据的情况下可能表现出几乎线性加速的并行排序算法?

我正在使用 Java,以防它对快速排序有任何影响。

编辑:请注意,这个问题主要与能够实现近线性加速的并行排序有关。 (意思是,当执行内核的数量从 P 增长到 2P 时,并行排序所花费的时间下降到在 上执行的计算的 55 - 50% P 个核心。)

【问题讨论】:

  • 您想要实现或已经实现的东西?前者,可能是合并排序?
  • 顺便说一句 - 这个问题可能会有所帮助:stackoverflow.com/questions/2210185/…
  • 在寻找更好的性能时,了解您现在的性能以及您的目标可能会很有用。你能发布一些数字,比如Arrays.sort() 需要多长时间,以及你想要达到什么速度?
  • 已经有点但不是 5e7 == 5^7 ?
  • @josefx 谢谢我知道我错过了什么

标签: java sorting parallel-processing unsigned


【解决方案1】:

如果你有很多内存,你可以使用Bucketsort。另一种与并行性相得益彰的算法是Quicksort

【讨论】:

    【解决方案2】:

    来自Quicksort 上的维基百科文章,

    与归并排序一样,快速排序也可以并行化,因为它具有 分而治之的性质。单独的就地分区操作 很难并行化,但一旦划分,不同的部分 该列表可以并行排序。下面是直截了当的 方法:如果我们有处理器,我们可以划分一个元素列表 平均时间为 O(n) 的子列表,然后将它们中的每一个排序 平均时间。忽略 O(n) 预处理和合并时间,这是 线性加速。如果拆分是盲目的,忽略值,则合并 天真的成本 O(n)。如果基于连续的分割分区 枢轴,并行化和天真的成本O(n)是棘手的。给定 O(log n) 或更多处理器,总共只需要 O(n) 时间, 而具有线性加速的方法将实现 O(log n) 时间 总体而言。

    显然,归并排序是另一种选择。我认为快速排序可以提供更好的平均情况性能。

    【讨论】:

      【解决方案3】:

      快速排序和归并排序都相当容易并行化。 Oracle 有一个基于 fork/join 的整数合并排序 here,您可能会使用它(如果不是按原样,那么至少作为灵感)。

      【讨论】:

      • 这些“易于并行化”的 Merge-/Quicksort 版本是“天真”并行的,因为它们各自的 Merge-/Partition-例程毕竟是串行的,根据我的测试并不能提供好的结果。
      【解决方案4】:

      假设您有几台计算机(亚马逊集群上有 5 台,对吗?)并且您想要升序排序。将您的阵列分成更小的块,使其适合每台机器。 假设您有 n 个块/数组。让每台机器对其块进行快速排序。这种排序 将是并行的(或多或少取决于块大小和机器速度等)。

      排序完成后,让机器合并块;

      您可以通过两种方式做到这一点:

      • 一次 2 台机器(您正在构建合并树)。合并将再次并行发生。问题是阵列会因合并而变大,您必须缓存到磁盘,因此当您再次合并时,机器会从磁盘读取。所以这里有一些惩罚。
      • 您一次可以做 n 台机器。拥有一台协调器机器,它从所有其他机器的阵列中获取最小值。这样,协调器机器通过从其他每个排序数组中获取最小的数字来构建整个排序数组。

      【讨论】:

        【解决方案5】:

        Bitonic sort 是一种针对并行机器的算法。这里有一个sequential Java version 和一个parallel C++ version 来帮助您入门。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-06
          • 2010-10-04
          • 1970-01-01
          相关资源
          最近更新 更多