正如标题所示,我需要制作一个比快速排序更快的算法。有问题的快速排序经过优化并用于幼稚的并行系统,因此单个线程完全完成每个快速排序,但多个线程同时进行快速排序。我需要制作一个比这个过程更快的算法。通过让额外的线程执行枢轴每一侧的排序来并行每个快速排序是否会更快,或者这个过程是否会产生过多的开销并最终导致速度变慢?对算法有什么建议吗?
2 回答
如果我理解正确,您当前有一个系统,其中 N 个线程由 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/。
这取决于数据的大小和性质。QS 在排序数据上的性能最差(如果有记忆的话)。正如您建议的那样,您可以为枢轴的每一侧提供一个线程,但您希望限制您的分区不会变得太小。请跟进并告诉我们进展如何,我很想知道,我相信其他人也会。