【发布时间】:2010-06-07 13:44:15
【问题描述】:
在列表被分成左右两半(小于和大于枢轴)之后,我正在使用 Pthreads 为每个分区创建一个新的线程。我递归地执行此操作,直到达到允许的最大线程数。
当我使用 printfs 跟踪程序中发生的事情时,我清楚地看到每个线程都在并行执行其委派工作。但是,使用单个进程始终是最快的。一旦我尝试使用更多线程,完成所需的时间几乎翻了一番,并且随着线程数的增加而不断增加。
我可以在运行它的服务器上使用多达 16 个处理器。
算法如下: 通过将元素与枢轴进行比较,将数组拆分为左右。 为左右开始一个新线程,并等待线程重新加入。 如果有更多可用线程,它们可以更递归地创建。 每个线程都等待它的子节点加入。
一切对我来说都有意义,排序工作得非常好,但线程越多,它的速度就越慢。
我尝试为要启动的线程设置每个分区的最小元素数(例如 50000)。
我尝试了一种方法,当一个线程完成后,它允许启动另一个线程,这导致数百个线程自始至终启动和完成。我认为开销太大了。所以我摆脱了它,如果一个线程执行完毕,就不会创建新线程。我得到了更多的加速,但仍然比单个进程慢很多。
我使用的代码如下。
有人知道我做错了什么吗?
【问题讨论】:
-
尝试将
num_processes设置为2,看看会发生什么。