精华内容
下载资源
问答
  • 亲爱的读者朋友大家晚上好,上次我们简单介绍了并行算法以及有关矩阵乘法的几个基本问题,这次我们来分析基于MapReduce的排序算法。详见:http://burningcloud.cn/article/126/index.html

    亲爱的读者朋友大家晚上好,上次我们简单介绍了并行算法以及有关矩阵乘法的几个基本问题,这次我们来分析基于MapReduce的排序算法。详见:http://burningcloud.cn/article/126/index.html

    展开全文
  • 双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。1、双调序列在了解双调排序算法之前,我们先来看看什么是双调序列。 双调序列是一个先单调递增...

    双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。

    1、双调序列

    在了解双调排序算法之前,我们先来看看什么是双调序列。 双调序列是一个先单调递增后单调递减(或者先单调递减后单调递增)的序列。

    2、Batcher定理

    将任意一个长为2n的双调序列A分为等长的两半X和Y,将X中的元素与Y中的元素一一按原序比较,即a[i]与a[i+n] (i < n)比较,将较大者放入MAX序列,较小者放入MIN序列。则得到的MAX和MIN序列仍然是双调序列,并且MAX序列中的任意一个元素不小于MIN序列中的任意一个元素[2]。

    3、双调排序

    假设我们有一个双调序列,则我们根据Batcher定理,将该序列划分成2个双调序列,然后继续对每个双调序列递归划分,得到更短的双调序列,直到得到的子序列长度为1为止。这时的输出序列按单调递增顺序排列。

    见下图:升序排序,具体方法是,把一个序列(1…n)对半分,假设n=2^k,然后1和n/2+1比较,小的放上,接下来2和n/2+2比较,小的放上,以此类推;然后看成两个(n/2)长度的序列,因为他们都是双调序列,所以可以重复上面的过程;总共重复k轮,即最后一轮已经是长度是2的序列比较了,就可得到最终的排序结果。

    双调排序示意图[1]:

    1c1c36b06ff5fd17f4babfa5889dd8c6.png

    4、任意序列生成双调序列

    前面讲了一个双调序列如何排序,那么任意序列如何变成一个双调序列呢?

    这个过程叫Bitonic merge, 实际上也是divide and conquer的思路。 和前面sort的思路正相反, 是一个bottom up的过程——将两个相邻的,单调性相反的单调序列看作一个双调序列, 每次将这两个相邻的,单调性相反的单调序列merge生成一个新的双调序列, 然后排序(同3、双调排序)。 这样只要每次两个相邻长度为n的序列的单调性相反, 就可以通过连接得到一个长度为2n的双调序列,然后对这个2n的序列进行一次双调排序变成有序,然后在把两个相邻的2n序列合并(在排序的时候第一个升序,第二个降序)。 n开始为1, 每次翻倍,直到等于数组长度, 最后就只需要再一遍单方向(单调性)排序了。

    以16个元素的array为例,

    1. 相邻两个元素合并形成8个单调性相反的单调序列,
    2. 两两序列合并,形成4个双调序列,分别按相反单调性排序
    3. 4个长度为4的相反单调性单调序列,相邻两个合并,生成两个长度为8的双调序列,分别排序
    4. 2个长度为8的相反单调性单调序列,相邻两个合并,生成1个长度为16的双调序列,排序

    示意图[1]:

    8b5918bf29f769aaf7511cfe76c85ae4.png

    详细Bitonic merge图(本图只画到生成一个16长的双调序列,最后排序没有画出):

    cba60379432a511f35899ebd8d2197b7.png

    最后再放一个8个元素排序的示意图[5]:

    34b3c2de2ce6bc4786f26e6d0558385d.png

    5、非2的幂次长度序列排序

    这样的双调排序算法只能应付长度为2的幂的数组。那如何转化为能针对任意长度的数组呢?一个直观的方法就是使用padding。即使用一个定义的最大或者最小者来填充数组,让数组的大小填充到2的幂长度,再进行排序。最后过滤掉那些最大(最小)值即可。这种方式会使用到额外的空间,而且有时候padding的空间比较大(如数组长度为1025个元素,则需要填充到2048个,浪费了大量空间)。但是这种方法比较容易转化为针对GPU的并行算法。所以一般来说,并行计算中常使用双调排序来对一些较小的数组进行排序[3]。 如果要考虑不用padding,用更复杂的处理方法,参考[4] n!=2^k的双调排序网络,本文略。

    参考资料

    • [1] CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现, http://blog.csdn.net/abcjennifer/article/details/47110991
    • [2] 并行计算】Bitonic Sort(双调排序)基础, http://blog.csdn.net/jiange_zh/article/details/49533477
    • [3] 双调排序:从串行到并行,以及OpenCL上的实现, http://blog.csdn.net/bryanlai0720/article/details/45094675
    • [4] n!=2^k的双调排序网络, http://blog.csdn.net/ljiabin/article/details/8630627
    • [5] 分段双调排序实现, http://blog.csdn.net/u014226072/article/details/56840243

    原文:https://blog.csdn.net/xbinworld/article/details/76408595

    MARSGGBO♥原创2019-1-3

    展开全文
  • 双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。 1、双调序列 在了解双调排序算法之前,我们先来看看什么是双调序列。 双调序列是一个先单调...

    双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。

    1、双调序列

    在了解双调排序算法之前,我们先来看看什么是双调序列。 双调序列是一个先单调递增后单调递减(或者先单调递减后单调递增)的序列。

    2、Batcher定理

    将任意一个长为2n的双调序列A分为等长的两半X和Y,将X中的元素与Y中的元素一一按原序比较,即a[i]与a[i+n] (i < n)比较,将较大者放入MAX序列,较小者放入MIN序列。则得到的MAX和MIN序列仍然是双调序列,并且MAX序列中的任意一个元素不小于MIN序列中的任意一个元素[2]。

    3、双调排序

    假设我们有一个双调序列,则我们根据Batcher定理,将该序列划分成2个双调序列,然后继续对每个双调序列递归划分,得到更短的双调序列,直到得到的子序列长度为1为止。这时的输出序列按单调递增顺序排列。

    见下图:升序排序,具体方法是,把一个序列(1…n)对半分,假设n=2^k,然后1和n/2+1比较,小的放上,接下来2和n/2+2比较,小的放上,以此类推;然后看成两个(n/2)长度的序列,因为他们都是双调序列,所以可以重复上面的过程;总共重复k轮,即最后一轮已经是长度是2的序列比较了,就可得到最终的排序结果。

    双调排序示意图[1]:

    4、任意序列生成双调序列

    前面讲了一个双调序列如何排序,那么任意序列如何变成一个双调序列呢?

    这个过程叫Bitonic merge, 实际上也是divide and conquer的思路。 和前面sort的思路正相反, 是一个bottom up的过程——将两个相邻的,单调性相反的单调序列看作一个双调序列, 每次将这两个相邻的,单调性相反的单调序列merge生成一个新的双调序列, 然后排序(同3、双调排序)。 这样只要每次两个相邻长度为n的序列的单调性相反, 就可以通过连接得到一个长度为2n的双调序列,然后对这个2n的序列进行一次双调排序变成有序,然后在把两个相邻的2n序列合并(在排序的时候第一个升序,第二个降序)。 n开始为1, 每次翻倍,直到等于数组长度, 最后就只需要再一遍单方向(单调性)排序了。以16个元素的array为例,

    1. 相邻两个元素合并形成8个单调性相反的单调序列,
    2. 两两序列合并,形成4个双调序列,分别按相反单调性排序
    3. 4个长度为4的相反单调性单调序列,相邻两个合并,生成两个长度为8的双调序列,分别排序
    4. 2个长度为8的相反单调性单调序列,相邻两个合并,生成1个长度为16的双调序列,排序

    示意图[1]:

    详细Bitonic merge图(本图只画到生成一个16长的双调序列,最后排序没有画出):

    最后再放一个8个元素排序的示意图[5]:

    5、非2的幂次长度序列排序

    这样的双调排序算法只能应付长度为2的幂的数组。那如何转化为能针对任意长度的数组呢?一个直观的方法就是使用padding。即使用一个定义的最大或者最小者来填充数组,让数组的大小填充到2的幂长度,再进行排序。最后过滤掉那些最大(最小)值即可。这种方式会使用到额外的空间,而且有时候padding的空间比较大(如数组长度为1025个元素,则需要填充到2048个,浪费了大量空间)。但是这种方法比较容易转化为针对GPU的并行算法。所以一般来说,并行计算中常使用双调排序来对一些较小的数组进行排序[3]。 如果要考虑不用padding,用更复杂的处理方法,参考[4] n!=2^k的双调排序网络,本文略。

     

     

    参考资料

    [1] CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现, http://blog.csdn.net/abcjennifer/article/details/47110991

    [2] 并行计算】Bitonic Sort(双调排序)基础, http://blog.csdn.net/jiange_zh/article/details/49533477

    [3] 双调排序:从串行到并行,以及OpenCL上的实现, http://blog.csdn.net/bryanlai0720/article/details/45094675

    [4] n!=2^k的双调排序网络, http://blog.csdn.net/ljiabin/article/details/8630627

    [5] 分段双调排序实现, http://blog.csdn.net/u014226072/article/details/56840243

     

    原文地址: https://blog.csdn.net/xbinworld/article/details/76408595

    展开全文
  • 双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld
    技术交流QQ群:433250724,欢迎对算法、技术、应用感兴趣的同学加入


    双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。

    1、双调序列

    在了解双调排序算法之前,我们先来看看什么是双调序列。 双调序列是一个先单调递增后单调递减(或者先单调递减后单调递增)的序列。

    2、Batcher定理

    将任意一个长为2n的双调序列A分为等长的两半X和Y,将X中的元素与Y中的元素一一按原序比较,即a[i]与a[i+n] (i < n)比较,将较大者放入MAX序列,较小者放入MIN序列。则得到的MAX和MIN序列仍然是双调序列,并且MAX序列中的任意一个元素不小于MIN序列中的任意一个元素[2]。

    3、双调排序

    假设我们有一个双调序列,则我们根据Batcher定理,将该序列划分成2个双调序列,然后继续对每个双调序列递归划分,得到更短的双调序列,直到得到的子序列长度为1为止。这时的输出序列按单调递增顺序排列。

    见下图:升序排序,具体方法是,把一个序列(1…n)对半分,假设n=2^k,然后1和n/2+1比较,小的放上,接下来2和n/2+2比较,小的放上,以此类推;然后看成两个(n/2)长度的序列,因为他们都是双调序列,所以可以重复上面的过程;总共重复k轮,即最后一轮已经是长度是2的序列比较了,就可得到最终的排序结果。

    双调排序示意图[1]:

    这里写图片描述

    4、任意序列生成双调序列

    前面讲了一个双调序列如何排序,那么任意序列如何变成一个双调序列呢?

    这个过程叫Bitonic merge, 实际上也是divide and conquer的思路。 和前面sort的思路正相反, 是一个bottom up的过程——将两个相邻的,单调性相反的单调序列看作一个双调序列, 每次将这两个相邻的,单调性相反的单调序列merge生成一个新的双调序列, 然后排序(同3、双调排序)。 这样只要每次两个相邻长度为n的序列的单调性相反, 就可以通过连接得到一个长度为2n的双调序列,然后对这个2n的序列进行一次双调排序变成有序,然后在把两个相邻的2n序列合并(在排序的时候第一个升序,第二个降序)。 n开始为1, 每次翻倍,直到等于数组长度, 最后就只需要再一遍单方向(单调性)排序了。

    以16个元素的array为例,
    1. 相邻两个元素合并形成8个单调性相反的单调序列,
    2. 两两序列合并,形成4个双调序列,分别按相反单调性排序
    3. 4个长度为4的相反单调性单调序列,相邻两个合并,生成两个长度为8的双调序列,分别排序
    4. 2个长度为8的相反单调性单调序列,相邻两个合并,生成1个长度为16的双调序列,排序

    示意图[1]:

    这里写图片描述

    详细Bitonic merge图(本图只画到生成一个16长的双调序列,最后排序没有画出):

    这里写图片描述

    最后再放一个8个元素排序的示意图[5]:

    这里写图片描述

    5、非2的幂次长度序列排序

    这样的双调排序算法只能应付长度为2的幂的数组。那如何转化为能针对任意长度的数组呢?一个直观的方法就是使用padding。即使用一个定义的最大或者最小者来填充数组,让数组的大小填充到2的幂长度,再进行排序。最后过滤掉那些最大(最小)值即可。这种方式会使用到额外的空间,而且有时候padding的空间比较大(如数组长度为1025个元素,则需要填充到2048个,浪费了大量空间)。但是这种方法比较容易转化为针对GPU的并行算法。所以一般来说,并行计算中常使用双调排序来对一些较小的数组进行排序[3]。 如果要考虑不用padding,用更复杂的处理方法,参考[4] n!=2^k的双调排序网络,本文略。

    参考资料

    [1] CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现, http://blog.csdn.net/abcjennifer/article/details/47110991
    [2] 并行计算】Bitonic Sort(双调排序)基础, http://blog.csdn.net/jiange_zh/article/details/49533477
    [3] 双调排序:从串行到并行,以及OpenCL上的实现, http://blog.csdn.net/bryanlai0720/article/details/45094675
    [4] n!=2^k的双调排序网络, http://blog.csdn.net/ljiabin/article/details/8630627
    [5] 分段双调排序实现, http://blog.csdn.net/u014226072/article/details/56840243

    展开全文
  • 4、快速排序算法并行化 5、描述了使用2m个处理器完成对n个输入数据排序的并行算法。 6、在最优的情况下并行算法形成一个高度为logn的排序树 7、完成快速排序的并行实现的流程图 8、完成快速排序的并行算法的实现
  • 并行实验报告一、项目背景项目要求实现快速排序、枚举排序、归并排序三种排序方法的串行和并行算法,并且进行性能比较和优化分析。其中数据集`random.txt`,当中包含30000个乱序数据,数据的范围是[-50000,50000],...
  • 4、快速排序算法并行化 5、描述了使用2m个处理器完成对n个输入数据排序的并行算法。 6、在最优的情况下并行算法形成一个高度为logn的排序树 7、完成快速排序的并行实现的流程图 8、完成快速排序的并行算法的实现
  • 并行排序算法

    2009-05-25 09:30:00
    促使我写了一个并行排序算法,这个排序算法充分利用多核CPU进行并行计算,从而提高排序的效率。 先简单说一下蛙蛙池塘给的A,B,C 三种算法(见上面引用的那篇博客),A算法将耗时的平方和开平方计算放到比较函数中...
  • 并行排序算法.pdf

    2020-08-05 05:42:19
    精品文档 并行排序算法 先简单说一下给的 ABC 三种算法 ( 见上面引用的那篇博客 ) A 算 法将耗时的平方和开平方计算放到比较函数中 导致 Array.Sort 时 每次亮亮比较都要执行平方和开平方计算其平均算法复杂度为 O...
  • 不一样的排序算法并行排序】

    千次阅读 2018-03-15 20:24:24
    比如冒泡排序,插入排序,选择排序,堆排序等等,但是随着计算机的发展,现在的计算机都是多核的处理器,串行排序无法高效的利用CPU,为了更加有效的利用CPU,我们在这里介绍一下在并行世界中的排序算法。...
  • 基于MPI的PSRS并行排序算法的实现摘 要本文介绍MPI并行编程环境和讨论和分析PSRS的并行排序算法,并在MP并行编程环境下实现PSRS的并行排序算法。关键词PSRS;MPI;并行计算;消息传递接口;并行算法一、引言并行计算...
  • 使用MPI计算的完整的PSRS(并行排序(parallel sorting by regular sampling))代码。并行计算课实验所用代码。
  • 最近老师讲了并行的排序算法,让我对这个原来不是很了解的排序算法产生了浓厚的兴趣。并行排序方法,是指采用并行计算的方法对一组数据进行排序,理论上是在类似内排序的环境下,采用多核并行的方法让时间降低,排序...
  • 整理最全资料:并行计算大作业:矩阵乘法,排序算法,代码+课件+报告超详细
  • 双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。 1、双调序列 在了解双调排序算法之前,我们先来看看什么是双调序列。 双调序列是一个先单调...
  • 以空间换时间的并行排序算法。 https://blog.csdn.net/Reborn_Lee/article/details/80469391 并行全比较排序算法介绍 排序是一种重要的数据运算,传统的排序方法主要靠软件串行方式实现,包括冒泡法、选择法、计数法...
  • 基于MPI的PSRS并行排序算法的实现

    千次阅读 2008-08-03 09:57:00
    基于MPI的PSRS并行排序算法的实现 摘 要 本文介绍MPI并行编程环境和讨论和分析PSRS的并行排序算法,并在MP并行编程环境下实现PSRS的并行排序算法。关键词 PSRS;MPI; 并行计算;消息传递接口;并行算法 一、 ...
  • 排序算法并行分析

    万次阅读 多人点赞 2016-05-05 00:52:11
    最近学了高性能计算这门课程,老师让用OpenMP、MPI或mapReduce写个大作业。我之前刚好在写排序,于是我就将常用的排序...首先跟大家分享一下我的心得体会,所谓排序算法,就是通过调整元素的位置达到想要的结果。我...
  • 点击下载:https://download.csdn.net/download/qq_40868987/11149885
  • 双调排序是data-independent的排序, 即比较顺序与数据无关的排序方法, 特别适合做并行计算,例如用GPU、fpga来计算。1、双调序列在了解双调排序算法之前,我们先来看看什么是双调序列。 双调序列是一个先单调递增...
  • 很多计算机专业的同学们相信你们学习算法的第一个排序就是冒泡吧,冒泡属于串行排序。所以本节我们想想并行的一些列方法。让你脑洞打开 二、并行排序 2.1 冒泡排序 里面的解释已经很清楚;以前上课的时候,看懂意思...
  • 如何借助并行计算的处理思想对算法进行改造? 并行排序 给大小为8GB的数据进行排序,且我们的内存可以一次性容纳这么多数据,对于排序来讲,最常用的就是时间复杂度为O(nlogn)的三种排序算法:归并排序、快速排序、...
  • 4、快速排序算法并行化 5、描述了使用2m个处理器完成对n个输入数据排序的并行算法。 6、在最优的情况下并行算法形成一个高度为logn的排序树 7、完成快速排序的并行实现的流程图 8、完成快速排序的并行算法的实现
  • 冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3 因为是从小到大排序,4和3的顺序显然是错误的,...
  • 并行排序

    千次阅读 2019-04-20 14:05:34
    并行排序算法是计算机并行计算能力大大发展之后,为了提高排序效率而提出的算法。 原有的的排序算法都是给定了数据再进行排序,排序的效率很大程度上取决于数据的好坏,例如快速排序、归并排序。并行排序则是一类...
  • 如何设计并行排序算法? 在并行计算的工作中,将每一个参与的电脑当作一个节点,节点通常是比较廉价的,可通过增加节点来提高效率。分为以下三个步骤及待解决问题: 将数据拆分到每个节点上(如何拆分,禁止拆分...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 270
精华内容 108
关键字:

并行计算排序算法