基于内存共享的并行排序算法慢谈(上)

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外并行

前面讨论的都是算法内部的并行,事实上也可以是外部并行,就是多个线程对不同的数据并行的排序。

事实上,由于快排的递归思想,它也可以看成是外部的。

你可能感兴趣的:(排序算法)