对于学校,我们有一项任务是创建一个多线程应用程序。我们选择进行归并排序的多线程实现。
然而,我们无法让它比串行实现更快地工作。
我已经尝试过以下方法:
- 无限线程的实现(代码示例 1)(非常慢)
- 线程有限的实现(代码示例 2)(最多 4 个线程 - 仍然很慢)
- 使用 Parallel.Invoke 实现(代码示例 3)(仍然较慢)
- 复杂的实现也具有并行合并功能(只是慢得可耻)
当我在 Visual Studio(仪器部分)中使用分析工具时,我发现调用函数的时间和线程解决方案总是比串行实现慢得多。
我看不出有任何可能的原因。
(例如:要排序 5000000 个数字;串行实现:16.717,17;并行:20.259,97;结果只需 1 个额外线程)
我在我拥有的两台机器上测试了它:
- Intel Core 2 Quad Q9450 @ 2.66Ghz
- 英特尔酷睿 i7 Q720 @1.60Ghz
我一生都无法弄清楚这是怎么可能的,这不应该只是加快进程吗?
如果有人能够帮助我,我会非常高兴。
代码示例1:
ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
Thread thread = new Thread(new ThreadStart(pMerge.parallel_merge));
thread.Start();
ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
pMerge2.parallel_merge();
thread.Join();
代码示例 2:
if(depthRemaining > 0)
{
ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
thread thread = new Thread(new ThreadStart(pMerge.parallel_merge));
thread.Start();
ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
pMerge2.parallel_merge();
thread.Join();
}
else
{
ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
pMerge.parallel_merge();
ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
pMerge.parallel_merge();
}
代码示例 3:
if (depthRemaining > 0)
{
Parallel.Invoke(
() => threaded_merge_sort(getallen, p, q, depthRemaining-1));
threaded_merge_sort(getallen, q + 1, r, 0);
}
else
{
threaded_merge_sort(getallen, p, q, 0);
threaded_merge_sort(getallen, q+1, r, 0);
}