【问题标题】:Making a Parallel Sorting Algorithm Faster than Naive Optimized Quicksort?让并行排序算法比朴素优化的快速排序更快?
【发布时间】:2013-10-17 15:10:08
【问题描述】:

正如标题所示,我需要创建一个比快速排序更快的算法。有问题的快速排序经过优化并用于幼稚的并行系统,因此单个线程完全完成每个快速排序,但多个线程同时进行快速排序。我需要制作一个比这个过程更快的算法。通过让额外的线程执行枢轴每一侧的排序来并行每个快速排序是否会更快,或者这个过程是否会产生过多的开销并最终导致速度变慢?对算法有什么建议吗?

【问题讨论】:

  • 一旦有了初始分区,将子部分的排序拆分到不同的线程是很自然的事情,如果内核可用,应该可以加快速度。
  • 使用额外的线程对每个子部分进行排序肯定会加速单个快速排序,但我的问题是关于系统中连续快速排序的加速。
  • 例如,如果一个有 4 个 1.0 GHZ 处理器,那么系统的吞吐量是 4.0 GHZ。如果您进行简单并行化,那么每个快速排序将在 1.0 GHZ 处理器完成它所需的时间内完成,但同时完成 4 个。如果您并行每个快速排序,那么每个快速排序将花费 4.0 GHZ 处理器完成它所需的时间,但是一次只会执行其中的一个。
  • 我认为这取决于您可用的处理器数量。如果您一次执行 N 个快速排序,并且您只有 N 个处理器和 1 个线程处理每个快速排序,那么使每个单独的快速排序多线程只会因为不必要的开销而减慢您的代码。另一方面,如果您确实有额外的处理器可用,那么处理器将补偿额外的开销,您可能会看到速度有所提高。
  • 我的系统中快速排序的数量远远大于处理器的数量,因此计算的减速时间可以忽略不计。

标签: c multithreading performance algorithm sorting


【解决方案1】:

如果我理解正确,您目前有一个系统,其中 N 个排序由 N 个线程执行。每个单独的排序由单个线程完成,但可以同时运行多个排序。您问的是编写并行排序算法是否会更快,以便每个排序由多个线程执行。

假设您有四个处理器,您必须进行 10 次排序。假设每个排序花费相同的时间(不现实,但对讨论很有用),那么如果每个排序在单个线程中运行,您可以同时运行四个排序。调用时间执行一个单线程排序一个时间段。

所以做各种事情的时间将是三个时间段。在两个周期内,您有四个同时运行的排序,在一个周期内,您有两个并发排序。在上一个时间段内,您有多余的容量(两个空闲处理器)。

如果您有一个使用四个线程的并行排序算法,那么最好的情况是每次排序将花费单线程排序时间的 1/4。所以理论上你可以在 10/4 个时间段内执行 10 次排序,这意味着它只需要 2.5 个时间段。

所以理论上你可以通过并行排序算法节省一半的时间。但是您不会意识到性能提升很大,因为快速排序不是 100% 可并行化的;有时会涉及少于四个线程。在每次排序期间,您都会有随机的空闲处理器。使用并行版本很可能总体上会变慢,因为这些小部分的空闲时间加起来了。

这样想:你有四个人需要做 10 份工作。他们可以做这 10 份工作,每人拿一份并单独做,或者通过合作,让四人中的每人在每份工作中完成 1/4 的工作。完成的工作量没有区别。在第一种情况下,您有两个空闲的工人,而最后两个工作正在完成。在第二种情况下,您在完成最后一项工作时有一些空闲时间; worker 1 空闲 3/4 时间段,worker 2 空闲 1/2 时间段,worker 3 空闲 1/4 时间段。所以理论上你的总的工作空闲时间是 6/4,或 1.5 个时间段。

但是,将工作从工作人员 1 转移到工作人员 2 等过程中也涉及空闲时间。该转换时间使两个工作人员都短暂空闲。这些小时间(每个工作 3 次转换,加上工人 1 获得下一份工作并开始工作的时间,以及工人 4 交付成品的时间)加起来,很可能超过 0.5 个时间段表面上是得救的。

不过,你可以试一试。并行化快速排序非常容易。例如,请参阅http://reedcopsey.com/2010/02/26/parallelism-in-net-part-11-divide-and-conquer-via-parallel-invoke/

【讨论】:

  • 谢谢!顺便说一句,您是否知道使算法本身并行与同时运行非并行算法的多个实例的幼稚并行化的术语? (即朴素并行化的反面是什么?)
【解决方案2】:

这取决于数据的大小和性质。 QS 在排序数据上的性能最差(如果有记忆的话)。正如您建议的那样,您可以为枢轴的每一侧提供一个线程,但您希望限制您的分区不会变得太小。请跟进并告诉我们进展如何,我很想知道,我相信其他人也会。

【讨论】:

  • 数据是完全随机的,它的大小是随机的。 QS 算法已经过优化,因此它会在效率更高时(在较小的尺寸下)执行插入排序。
  • 正如我在 OP 的评论中所说,我担心每个 QS 的并行化是否实际上会产生更快的吞吐量,因为每个 QS 会更快地完成,但会完成更少的排序在任何给定时间(所有处理器的内核都具有最大吞吐量潜力)。
  • 这取决于阿姆达尔定律 (en.wikipedia.org/wiki/Amdahl's_law)。像这样的一般问题可能非常复杂,因为如果您有很多处理器内存开销可能是一个问题。我假设您的 Intel CPU 的内核数介于 4-16 (HT) 之间。 QS 算法的优化不是我对分区的关注,而是您希望线程有足够的工作来支付创建/使用的开销。所以最后 n 个枢轴将在同一个线程上完成(通常你必须通过实验来确定阈值)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 2021-06-06
  • 2010-10-04
  • 2020-08-14
  • 1970-01-01
  • 2012-09-09
相关资源
最近更新 更多