并行合并排序线程数比Seq慢/多合并排序帮助

问题描述

| http://pastebin.com/YMS4ehRj ^这是我对并行合并排序的实现。基本上,我要做的是,对于每个拆分,上半部分都是由线程处理的,而后半部分是顺序的(即)说我们有9个元素的数组,[0..4]由线程1处理,[0 ..1]由线程2处理,[5..6]由线程3处理(请参阅源代码进行澄清)。 其他所有内容都保持不变,例如合并。但是问题是,这比合并排序要慢得多,甚至比普通气泡排序还慢!我的意思是25000 int \的数组。我不确定瓶颈在哪里:是互斥锁吗?是合并吗? 关于如何使其更快的任何想法?     

解决方法

您正在创建大量线程,每个线程仅执行很少的工作。要对25000个整数进行排序,您需要创建大约12500个线程,这些线程会生成其他线程并合并它们的结果,而大约12500个线程仅对两个整数进行排序。 创建所有这些线程的开销远远超过了从并行处理中获得的收益。 为避免这种情况,请确保每个线程都有合理的工作量。例如,如果一个线程发现只需要对<10000个数字进行排序,则可以简单地使用常规合并排序对它们本身进行排序,而无需产生新线程。     ,给定系统上核心数量有限,为什么要创建比核心更多的线程? 同样,也不清楚为什么需要一个互斥锁。据我从快速扫描得知,该程序不需要在本地函数外部共享线程[lthreadcnt]。只需使用局部变量,您应该会很高兴。     ,您的并行性太细粒度了,有太多的线程在做很小的工作。您可以定义阈值,以便对大小小于阈值的数组进行顺序排序。小心产生的线程数,这很好地表明,线程数通常不会比内核数大很多。 因为您的大部分计算都在
merge
函数中进行,所以另一个建议是使用分而治之合并而不是简单合并。优点是两方面的:运行时间更短,并且很容易生成线程以运行并行合并。您可以在此处获得有关如何实现并行合并的想法:http://drdobbs.com/high-performance-computing/229204454。他们也有一篇有关并行合并排序的文章,可能会对您有所帮助:http://drdobbs.com/high-performance-computing/229400239     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...