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