zoukankan      html  css  js  c++  java
  • 基于内存共享的并行排序算法慢谈(上)

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

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

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

  • 相关阅读:
    Linux下的输入/输出重定向
    strcpy与strncpy的区别
    C++的函数重载
    gtest 学习二
    gtest 学习一
    char* wchar* char wchar转换
    iconv 编译不通过问题
    嵌入式常用库
    驱动编程class_create说明
    libiconv 交叉编译
  • 原文地址:https://www.cnblogs.com/2010Freeze/p/2562108.html
Copyright © 2011-2022 走看看