1.前言
并行程序设计的重要性我就不多说了,可悲的是明知它重要,我却没学好。这不还是碰到了,请听题:
请用Python多线程对一个4G以上的文件, 进行外排序,尽量优化性能。假设系统内核数为8,Mem=512MB,关键字是字符串
记得上学期开始上并行程序设计的时候,我还是激情澎湃的。但是后来就萎了。
每次上手一样新东西,我都会到园里翻翻看,但是不幸的是园里关于这块好的文章不太多。
我不知道是什么原因,可能是现成的东西太多了吧。这块骨头不好啃啊,所以打算分几个篇幅来说。
本文的主题是-基于内存共享的并行排序算法。本人水平有限,如果有什么不恰当的,
请大家一定不要吝啬指正,这也是我写本文的目的之一,有讨论才有进步嘛。
2.大纲
1.前言
2.大纲
3.基于内存共享的并行排序设计
4.高级排序算法并行化
5.外排序与内排序
6.实验
3.基于内存共享的并行排序设计
事实上并行里面应用更广泛的是基于消息传递的并行程序设计,我想可能是因为它们可并行的规模级别不一样吧。
通过shell命令:cat /proc/cpuinfo |grep 'processor'|wc -l
就可以查看系统CPU的核数,k=8。
算法的并行化与算法并行部分的依赖性有关,关于这块我也不是很懂,就不多说了。
排序不像查找,查找可以让几个进程并行的独立的工作,这个独立还是永久独立的。
排序的含义决定了他是一个整体相关的操作,好像也只有快速排序能打破它这个限制。
下面我们来具体探讨几种高级排序算法如何并行化。
4.高级排序算法并行化
假设待排序规模为N。
4.1希尔排序
希尔排序算法中的增量序列至今仍没被完全研究透。但我们知道这个序列总是从大到小最终一定要变为1的。
当d>1时,可以有d-1个线程同时并行在各自的序列内进行插入排序。当d=1时就不能并行了。
d>=k的时候,可并行的最多,加速效率是最大的。
那么这里有个问题需要弄清楚:对于一个希尔排序[d1,...dn],可并行的计算量占整体计算量的比例是多少。
这些可并行的计算量里又有多少加速效率是最大的。这个我们去分析过,但我觉得d=1占的计算比例肯定不小,
就算最好情况也要N次比较。最差情况下的比较次数应该不会超过dn-1N。有兴趣的可以量化下。
4.2堆排序
堆排序包括初始建堆和筛选。
依赖性好像很大,高手想想办法吧,偶是不行了。
4.3快速排序
快速排序一直是个宠儿,园里关于快速排序并行化的文章倒有:
http://www.cnblogs.com/itfreer/archive/2012/05/14/erlang_in_practise_quick-sort.html
快速排序的并行化好像也很有优势,因为他不需要最后做'统一'处理,而希尔排序和归并排序都需要。
本文也首先考虑用快速排序解决问题,因为它可以最大化大发挥并行的威力。
4.4归并排序
我没研究过k路归并排序里哪个最好,只知道最常用的是2路归并排序。
其并行化有点类似于希尔排序,最后一步也就是合并最后两个有序块时,应该也是不能并行的。
不过归并思想在外排序中很有用,后面会再提到的。
4.5外并行
前面讨论的都是算法内部的并行,事实上也可以是外部并行,就是多个线程对不同的数据并行的排序。
事实上,由于快排的递归思想,它也可以看成是外部的。