【发布时间】:2011-09-01 01:59:56
【问题描述】:
^ 这是我的并行归并排序的实现。基本上我所做的是,对于每个拆分,前半部分由线程处理,而后半部分是顺序的(即)说我们有一个由 9 个元素组成的数组,[0..4] 由线程 1 处理,[0 ..1] 由线程 2 处理,[5..6] 由线程 3 处理(请查看源代码以进行澄清)。
其他一切都保持不变,例如合并。但问题是,这比归并排序慢得多,甚至比普通冒泡排序还要慢!我的意思是一个 25000 个整数的数组。我不确定瓶颈在哪里:是互斥锁吗?是合并吗?
关于如何使这更快的任何想法?
【问题讨论】:
-
对于 stackoverflow 问题,您不应该使用在一天内过期的 pastebin - 它会阻止其他人学习如何在下周解决您的问题(或明天回答您的问题)。
-
你根本不应该使用 pastebins。
-
不要通过并行执行相同的位来实现递归样式的合并排序。当子列表下降到 1000 长时,线程通信的开销开始接近合并所花费的时间,所以只需进行快速排序,(或其他任何 - 刚刚看到的帖子 - 同一点)。另外,正如其他人所说,只需将您的合并排队到 [no.核心]线程,或其他一些线程池实现。您可以将合并与回调同步。如果这样做,4/8 核处理器上的“平铺合并排序”将对 1000000 个整数进行排序,比单线程快速排序快六倍。
标签: c pthreads parallel-processing mutex mergesort