多种排序的并行算法(具体)

合集下载

并行算法设计

并行算法设计

并行算法设计一、引言并行算法是指在多核处理器或分布式系统上同时执行多个子任务,以提高计算效率和处理速度的一种计算模式。

随着计算机硬件技术的不断发展,越来越多的问题需要借助并行算法来解决。

本文将介绍并行算法的设计原则和常见的设计模式,以及在实际应用中的一些注意事项。

二、并行算法设计原则1. 任务划分原则:并行算法的基础是将原本串行执行的任务划分成多个独立的子任务,并通过适当的调度算法分配给不同的处理器进行并行执行。

任务划分应尽量保持任务的独立性,避免数据依赖关系过多,以提高并行度和性能。

2. 数据分布原则:在设计并行算法时,应根据不同任务的计算量和数据量合理规划数据分布方式。

对于计算密集型任务,可以将数据均匀划分给多个处理器;对于数据密集型任务,可以采用数据分布策略来平衡负载和减少数据通信的开销。

3. 通信和同步原则:并行算法中,处理器间的通信和同步操作是必不可少的。

在设计并行算法时,应考虑如何减少通信和同步的开销,以提高整体的算法性能。

可以通过减少数据传输量、合理设置同步点等方式来优化并行算法的通信和同步操作。

4. 任务调度原则:任务调度是指将多个子任务合理地分配给不同的处理器进行执行的过程。

合理的任务调度策略可以提高并行算法的负载均衡性和吞吐量,并减少处理器间的竞争情况。

在设计并行算法时,应考虑任务划分和任务调度的关系,选择合适的调度策略来优化算法性能。

三、并行算法设计模式1. 分治法:分治法是指将一个大问题分解成多个相互独立的小问题,并通过递归的方式将小问题的解合并成大问题的解。

在设计并行算法时,可以将原问题划分成多个子问题,分配给不同的处理器并行解决,最后将子问题的解合并得到最终结果。

2. 数据并行:数据并行是指将数据划分成多个子集,分配给不同的处理器并行处理。

对于同一类操作,各处理器可以独立计算自己所负责的数据子集,最后将各处理器计算得到的结果合并得到最终结果。

3. 流水线:流水线是指将一个任务划分成多个子任务,并通过不同的处理器按照一定的顺序依次执行。

基于fpga的多路并行归并排序系统的制作方法

基于fpga的多路并行归并排序系统的制作方法

一、概述随着数字技术的不断发展和普及,信息处理的需求日益增长。

对于大规模数据的排序、搜索和处理,传统的软件算法往往效率低下。

而基于FPGA(Field Programmable Gate Array)的并行计算系统,具有高效、灵活、低功耗等优势,成为解决大规模数据处理问题的重要途径。

本文将重点介绍基于FPGA的多路并行归并排序系统的制作方法。

二、多路并行归并排序系统原理介绍1. 多路归并排序多路归并排序是一种高效的排序算法,可以将大规模数据分割为多个子序列进行排序,然后合并排序结果。

传统的多路归并排序算法通常采用串行方式进行,效率较低。

2. 并行计算系统原理FPGA是一种灵活可编程的硬件评台,可以根据需要配置内部逻辑和连接,实现并行计算任务。

基于FPGA的并行计算系统可以充分利用硬件评台的并行计算能力,提高算法的执行效率。

3. 基于FPGA的多路并行归并排序系统基于FPGA的多路并行归并排序系统将多路归并排序算法与并行计算系统相结合,利用FPGA的并行计算能力,将数据分割为多个子序列进行排序,并行地进行归并操作,从而提高排序效率。

三、多路并行归并排序系统的制作方法1. 硬件设计(1)确定并行计算单元数量根据待排序数据规模和FPGA硬件资源,确定多路并行归并排序系统的并行计算单元数量。

通常采用并行计算单元数量与FPGA硬件核心数相匹配的原则。

(2)设计并行计算模块将多路归并排序算法划分为多个并行计算模块,并设计每个模块的输入输出接口、控制逻辑和数据路径。

在硬件设计中,需要充分考虑并行计算模块之间的数据通路和同步控制。

2. 软件编程(1)并行计算模块的逻辑设计对每个并行计算模块进行逻辑设计,利用HDL(硬件描述语言)进行逻辑表达,并进行仿真验证和时序优化。

(2)并行计算模块的功能实现根据多路归并排序算法的具体要求,实现并行计算模块的排序、合并操作功能,保证数据处理的正确性和执行效率。

3. 系统集成(1)硬件系统集成将设计好的并行计算模块进行综合、布局和布线,生成FPGA可执行的硬件逻辑文件。

并行排序与搜索算法

并行排序与搜索算法

▪ 基于分布式内存的并行归并排序
1.将待排序数据划分为多个子序列,并将每个子序列分配给一 个计算节点进行处理,可以实现分布式并行排序。 2.计算节点之间需要通过网络通信等技术进行数据传输和同步 ,保证排序的正确性和效率。 3.针对不同的分布式系统和应用程序场景,需要优化计算节点 的调度和数据传输策略。
1.根据并行化的方式不同,归并排序并行化方法可分为基于共 享内存和基于分布式内存的两类。 2.基于共享内存的并行归并排序主要采用多线程或GPU加速等 技术。 3.基于分布式内存的并行归并排序则利用分布式系统的资源进 行并行排序。
归并排序并行化方法
▪ 基于共享内存的并行归并排序
1.通过将待排序数据划分为多个子序列,并将每个子序列分配 给一个线程或GPU进行处理,可以实现并行排序。 2.线程或GPU之间需要通过同步和通信等机制保证排序的正确 性和效率。 3.针对不同的硬件平台和应用程序场景,需要优化线程或GPU 的调度和分配策略。
并行排序与搜索算法
MapReduce模型下的搜索算法
MapReduce模型下的搜索算法
MapReduce模型下的搜索算法概述
1.MapReduce模型的基本原理。2.搜索算法在MapReduce模型下的应用。3.并行化搜索算法的优 势。 MapReduce模型下的搜索算法是基于MapReduce计算模型的一种并行化搜索算法。它通过将大 规模数据集划分为多个小数据块,并在多个计算节点上进行并行处理,可以大大提高搜索效率。该 算法可以广泛应用于搜索引擎、数据挖掘、机器学习等领域。
MapReduce模型下的搜索算法总结与展望
1.总结MapReduce模型下的搜索算法的优势和不足。2.展望MapReduce模型下的搜索算法的未来 发展前景和应用领域。 MapReduce模型下的搜索算法具有并行化、高效性、可扩展性等优点,但也存在一些不足之处, 如数据划分策略的影响、计算节点的负载均衡问题等。随着技术的不断发展,MapReduce模型下 的搜索算法将有更广阔的发展前景和应用领域。

并行计算的原理和并行算法优化

并行计算的原理和并行算法优化

并行计算的原理和并行算法优化随着硬件技术的快速进步,越来越多的计算机系统采用并行计算方式,从而获得更高的计算效能。

并行计算在许多领域都有应用,例如科学计算、图像处理、语音识别、机器学习等。

本文将介绍并行计算的原理和并行算法优化。

一、并行计算的原理并行计算是指同一时刻有多个计算任务同时进行的计算方式。

在主流多核处理器架构中,每个核心都可以独立地执行指令,这使得并行计算变得容易。

并行计算的优点是可以大幅度提高计算效率和速度。

同时,由于计算任务被分解成许多小任务,每个任务的数据量进一步减小,从而使计算变得更加高效。

并行计算的实现需要满足以下条件:1、任务可拆分性:计算任务必须被分解成多个相对独立的子任务,每个子任务可以分配给不同的计算单元。

2、任务间并行性:任务必须是可以同时执行的,这意味着任务之间的数据和控制流必须满足并行计算的条件。

3、数据分布性:任务执行所需的数据必须被存储在能够被多个计算单元访问的地方。

并行计算可以通过多种方式实现,其中最常见的是并行执行和并行数据处理。

在并行执行中,计算任务被分配给多个计算单元,每个计算单元独立地执行一个子任务。

在并行数据处理中,数据被分解成多个块,每个块可以被不同的处理单元处理。

二、并行算法优化并行算法是一个并行计算任务的实现方式。

通常情况下,一个并行计算任务由多个计算步骤组成,每个步骤可以使用不同的并行算法来实现。

合理选择并行算法可以显著提高计算效率和速度。

并行算法的优化可以从以下几个方面入手:1、负载均衡性:对于一个并行任务,每个计算单元的工作量应该尽量相等,也就是说,应尽可能减小负载不均衡的影响。

实现负载均衡的方法包括任务分配器的设计和动态负载均衡技术的应用。

2、通信代价:并行计算中,大量的数据要在不同计算单元之间传输,因此通信代价成为影响计算效率的一个重要因素。

为了减小通信代价,可以尝试数据压缩、本地数据重用和通信次数最小化等方法。

3、局部性和并行性:并行计算涉及大量的数据访问,如果数据被存储在不能被多个计算单元访问的地方,则会影响并行计算的效能。

串行和并行算法

串行和并行算法

串行和并行算法引言在计算机科学中,算法是指解决问题的一系列步骤或规则。

在计算机程序中,算法起着至关重要的作用。

根据计算机程序运行时指令的执行顺序,算法可以分为串行算法和并行算法。

本文将深入探讨串行和并行算法的概念、特点以及应用领域。

串行算法串行算法是指在计算机程序中所有指令按照顺序依次执行的算法。

在串行算法中,计算机程序只使用一个处理器核心来执行所有的指令。

串行算法是最基本的算法类型,也是最常见的算法类型之一。

特点1.顺序执行:串行算法的特点是指令按照严格的顺序依次执行,每个指令的执行都依赖于前一个指令的执行结果。

2.单核心:串行算法只使用一个处理器核心,不能利用多核心并行计算的优势。

应用串行算法广泛应用于各行各业,如文本处理、图像处理、数值计算等。

其中一些问题由于其本质的顺序性质,只能用串行算法来解决,例如排序算法中的冒泡排序就是经典的串行算法。

并行算法并行算法是指在计算机程序中,多个指令可以同时执行的算法,通过利用多个处理器核心的计算能力,实现指令的并行执行。

特点1.并行执行:并行算法的特点是指令可以同时执行,不需要等待前一个指令的执行结果。

2.多核心:并行算法使用多个处理器核心来执行指令,充分利用了多核技术的优势。

应用并行算法广泛应用于需要大量计算的领域,如科学计算、人工智能、数据挖掘等。

在这些领域中,数据量庞大,串行算法往往无法满足实时计算的需求,而并行算法可以通过利用多核并行计算来加速计算过程,提高计算效率。

串行算法与并行算法的区别与联系串行算法和并行算法在指令执行的顺序和处理器核心的使用上存在明显的区别。

串行算法按照指令的顺序执行,只使用一个处理器核心,而并行算法可以同时执行多条指令,使用多个处理器核心。

两者存在联系的地方在于,并行算法可以通过将串行算法中的一部分指令并行执行,来提高程序的执行效率。

例如,在冒泡排序算法中,可以将排序过程分为多个子任务,每个子任务可以在不同的处理器核心上并行执行,加快排序速度。

串行和并行算法

串行和并行算法

串行和并行算法
《串行和并行算法》
一、串行算法
1、什么是串行算法
串行算法是一种简单的解决问题的方法,它采用单个处理器来完成任务,按照程序指定顺序执行每一步,由此解决问题。

串行算法不需要并行运算,可以节约系统的资源,如不需要多台处理器,比如,当解决一个复杂的问题时,可以将该问题分解成若干个简单的子问题,经过按照程序顺序一步一步计算,最终求得解决方案。

2、串行算法的特点
(1)易于编程:串行算法是一种简单的算法,只需要设计一个
计算过程,按照程序设定的顺序来执行,不需要考虑多处理器之间的协调,在编程时会比较容易写出准确的程序。

(2)无需编写同步代码:串行算法是在单处理器上完成的,无
需考虑多处理器之间的同步,也不需要编写任何同步代码。

(3)提供较高的存储带宽:串行算法只使用一个处理器,不需
要为多个处理器之间分配存储,因此可以提供比较高的存储带宽,可以更加有效地使用系统资源。

二、并行算法
1、什么是并行算法
并行算法是指在多个处理器上同时执行的算法,它通常比串行算法更快,因为它充分利用了多处理器的计算能力来解决问题。

2、并行算法的特点
(1)提高计算性能:由于采用多个处理器进行计算,因此可以大大提高计算性能,多个处理器可以同时进行计算,节约时间。

(2)需要编写同步代码:多处理器之间需要进行协调,因此需要编写特殊的同步代码,以保证多处理器之间可以正确的协调,以求得最优效能。

(3)提供较少的存储带宽:为了提供多处理器之间的协调,需要分配较多的存储,以提供比较大的存储带宽,以便多处理器可以有效地使用系统资源。

并行计算的分类

并行计算的分类

并行计算的分类随着计算机技术的不断发展,计算能力和算法的复杂程度也得到了大幅提升,但是在某些场景下,单个计算机的计算能力和运行速度已经无法满足需求。

并行计算应运而生,可以利用多个计算机或者处理器同时进行计算任务,进而提高计算速度和效率。

并行计算的分类可以从不同角度进行区分,下面是常见的并行计算分类。

1.按照并行度分类并行度是指在并行计算中,可同时执行的任务数目。

根据并行度的不同,可以将并行计算分为以下几类。

(1)任务并行:任务并行是指将大的计算任务分为多个小的子任务,然后将子任务分配给多个处理器进行同时计算。

这种并行化策略可以极大地提高计算速度和效率。

例如,在图像处理中,可以将一幅图像分成多个子区域,然后交给多个处理器并行计算。

(2)数据并行:数据并行是指将大的数据集分为多份,然后将数据分配给多个处理器进行计算。

例如,在机器学习中,可以将数据集分为多份,然后交给多个处理器进行同时训练。

(3)管道并行:管道并行是指将多个处理器按照流水线方式进行组合,每个处理器负责一道计算工序,然后将结果传递给下一个处理器。

例如,在视频处理中,可以将视频编码器和解码器按照流水线方式进行组合,提高视频处理的效率。

(4)混合并行:混合并行是指以上所述所有并行化方式的混合使用。

2.按照计算资源分类根据计算资源的不同,可以将并行计算分为以下几类。

(1)集中式并行计算:集中式并行计算是指将多个处理器或者计算机集中在一个计算中心进行协同工作,以完成一些大规模计算任务。

例如,在云计算中,可以将多个计算机集成在同一数据中心,来实现大规模的计算任务。

(2)分散式并行计算:分散式并行计算通常是通过网络进行协同工作,各个计算机或者处理器之间互相通讯,协同完成计算任务。

例如,在分布式系统中,每个计算机负责执行一部分计算任务,并将结果传递给其他计算机进行处理。

3.按照工作量分配策略分类根据工作量分配策略的不同,可以将并行计算分为以下几类。

(1)静态数据分配:静态数据分配是指将数据集按照静态的方法分配给各个处理器进行计算。

并行计算的算法

并行计算的算法

并行计算的算法随着计算机技术的不断发展,计算机处理能力不断提升,计算机科学家们便开始思考如何更好地利用计算机的性能。

并行计算便是一种解决方案,能够在多个处理器间同时完成任务,从而提高系统的效率。

在实际应用中,许多问题都需要进行高效的并行计算,因此一些优秀的并行算法也应运而生。

本文将介绍一些常见的并行算法,包括并行排序、并行搜索、并行图像处理等。

一、并行排序算法排序是计算机科学中最基础的算法之一,实现排序算法的方式很多。

在大数据量的情况下,串行排序算法会带来很大的时间开销,因此需要并行排序算法来提高效率。

经典的并行排序算法有PQsort、Sample sort、Quick sort等,其中PQsort的性能较为出色。

其思想是将序列切分成若干个小块,通过多个处理器并行排序,最终将小块合并成有序序列。

二、并行搜索算法并行搜索在分布式计算等领域有着广泛的应用。

相比于串行搜索算法,其可以更快地寻找目标,同时可用于搜索更大的数据集。

并行搜索算法的核心思想是通过利用多个处理器同时搜索目标,以达到更快速响应和更准确的结果。

典型的并行搜索算法有OpenMP深度优先算法等。

三、并行图像处理算法图像处理是计算机视觉中一个重要的领域。

在图像处理中,经常需要处理大量的数据,因此并行算法应用也相当广泛。

并行图像处理算法可以通过同时操作多个独立的图像像素,提高处理速度。

典型的并行图像处理算法有OpenMPI空间滤波算法、CUDA GPU加速算法等。

总结本文介绍了并行计算的算法,包括并行排序算法、并行搜索算法和并行图像处理算法。

这些算法在高效处理大规模数据、更快速地响应、提高处理性能上发挥了重要作用。

随着计算机性能的不断提高,更多的并行算法将不断被开发和优化,为各个领域的计算机应用提供有效的支持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1 排序排序是数据处理中经常使用的一种重要运算,如何进行排序,特别是如何进行高效的排序,是计算机应用中的重要课题。

排序的对象一般是一组记录组成的文件,而记录则是由若干数据项组成,其中的一项可用来标志一个记录,称为关键字项,该数据项的值称为关键字。

所谓排序,就是要整理文件中的记录,使得它按关键字递增(或递减)的次序排列起来。

若给定的文件含有n个记录{R1,R2,…,R n},它们的关键字分别为{K1,K2,…,K n},要把这n个记录重新排列成为{R i1,R i2,…,R in},使得{K i1≥K i2≥…≥K in}(或{K i1≤K i2≤…≤K in})。

本章主要介绍了枚举排序、快速排序、PSRS排序算法以及它们的MPI编程实现。

1.1 枚举排序1.1.1 枚举排序及其串行算法枚举排序(Enumeration Sort)是一种最简单的排序算法,通常也称为秩排序(Rank Sort)。

该算法的具体思想是(假设按关键字递增排序),对每一个待排序的元素统计小于它的所有元素的个数,从而得到该元素最终处于序列中的位置。

假定待排序的n个数存在a[1]…a[n]中。

首先将a[1]与a[2]…a[n]比较,记录比其小的数的个数,令其为k,a[1]就被存入有序的数组b[1]…b[n]的b[k+1]位置上;然后将a[2]与a[1],a[3]…a[n]比较,记录比其小的数的个数,依此类推。

这样的比较操作共n(n-1)次,所以串行秩排序的时间复杂度为O(n2)。

算法13.1 枚举排序串行算法输入:a[1]…a[n]输出:b[1]…b[n]Beginfor i=1 to n do(1) k=1(2) for j=1 to n doif a[i]>a[j] thenk=k+1end ifend for(3) b[k]= a[i]end forEnd1.1.2 枚举排序的并行算法对该算法的并行化是很简单的,假设对一个长为n的输入序列使用n个处理器进行排序,只需是每个处理器负责完成对其中一个元素的定位,然后将所有的定位信息集中到主进程中,由主进程负责完成所有元素的最终排位。

该并行算法描述如下:算法13.2 枚举排序并行算法输入:无序数组a[1]…a[n]输出:有序数组b[1]…b[n]Begin(1)P0播送a[1]…a[n]给所有P i(2) for all P i where 1≤i≤n para-do(2.1) k=1(2.2) f or j = 1 to n doif (a[i] > a[j]) or (a[i] = a[j] and i>j) thenk = k+1end ifend for(3)P0收集k并按序定位End在该并行算法中,使用了n个处理器,由于每个处理器定位一个元素,所以步骤⑵的时间复杂度为O(n);步骤⑶中主进程完成的数组元素重定位操作的时间复杂度为O(n),通信复杂度分别为O(n);同时⑴中的通信复杂度为O(n2);所以总的计算复杂度为O(n),总的通信复杂度为O(n2)。

MPI源程序请参见所附光盘。

1.2 快速排序1.2.1 快速排序及其串行算法快速排序(Quick Sort)是一种最基本的排序算法,它的基本思想是:在当前无序区R[1,n]中取一个记录作为比较的“基准”(一般取第一个、最后一个或中间位置的元素),用此基准将当前的无序区R[1,n]划分成左右两个无序的子区R[1,i-1]和R[i,n](1≤i≤n),且左边的无序子区中记录的所有关键字均小于等于基准的关键字,右边的无序子区中记录的所有关键字均大于等于基准的关键字;当R[1,i-1]和R[i,n]非空时,分别对它们重复上述的划分过程,直到所有的无序子区中的记录均排好序为止。

算法13.3 单处理机上快速排序算法输入:无序数组data[1,n]输出:有序数组data[1,n]Begincall procedure quicksort(data,1,n)Endprocedure quicksort(data,i,j)Begin(1) if (i<j) then(1.1)r = partition(data,i,j)(1.2)quicksort(data,i,r-1);(1.3)quicksort(data,r+1,j);end ifEndprocedure partition(data,k,l)Begin(1) pivo=data[l](2) i=k-1(3) for j=k to l-1 doif data[j]≤pivo theni=i+1exchange data[i] and data[j]end ifend for(4) exchange data[i+1] and data[l](5) return i+1End快速排序算法的性能主要决定于输入数组的划分是否均衡,而这与基准元素的选择密切相关。

在最坏的情况下,划分的结果是一边有n-1个元素,而另一边有0个元素(除去被选中的基准元素)。

如果每次递归排序中的划分都产生这种极度的不平衡,那么整个算法的复杂度将是Θ(n2)。

在最好的情况下,每次划分都使得输入数组平均分为两半,那么算法的复杂度为O(n log n)。

在一般的情况下该算法仍能保持O(n log n)的复杂度,只不过其具有更高的常数因子。

1.2.2 快速排序的并行算法快速排序算法并行化的一个简单思想是,对每次划分过后所得到的两个序列分别使用两个处理器完成递归排序。

例如对一个长为n的序列,首先划分得到两个长为n/2的序列,将其交给两个处理器分别处理;而后进一步划分得到四个长为n/4的序列,再分别交给四个处理器处理;如此递归下去最终得到排序好的序列。

当然这里举的是理想的划分情况,如果划分步骤不能达到平均分配的目的,那么排序的效率会相对较差。

算法13.4中描述了使用2m 个处理器完成对n个输入数据排序的并行算法。

算法13.4 快速排序并行算法输入:无序数组data[1,n],使用的处理器个数2m输出:有序数组data[1,n]Beginpara_quicksort(data,1,n,m,0)Endprocedure para_quicksort(data,i,j,m,id)Begin(1) if (j-i)≤k or m=0 then(1.1) P id call quicksort(data,i,j)else(1.2) P id: r=patrition(data,i,j)(1.3) P id send data[r+1,m-1] to P id+2m-1(1.4) p ara_quicksort(data,i,r-1,m-1,id)(1.5) p ara_quicksort(data,r+1,j,m-1,id+2m-1)(1.6) P id+2m-1send data[r+1,m-1] back to P idend ifEnd在最优的情况下该并行算法形成一个高度为log n的排序树,其计算复杂度为O(n),通信复杂度也为O(n)。

同串行算法一样,在最坏情况下其计算复杂度降为O(n2)。

正常情况下该算法的计算复杂度也为O(n),只不过具有更高的常数因子。

MPI源程序请参见所附光盘。

1.3 PSRS排序1.3.1 PSRS算法原理并行正则采样排序,简称PSRS(Parallel Sorting by Regular Sampling)它是一种基于均匀划分(Uniform Partition)原理的负载均衡的并行排序算法。

假定待排序的元素有n个,系统中有p个处理器,那么系统首先将n个元素均匀地分割成p段,每段含有n/p个元素,每段指派一个处理器,然后各个处理器同时施行局部排序。

为了使各段中诸局部有序的元素在整个序列中也能占据正确的位置,那么就首先从各段中抽取几个代表元素,再从他们产生出p-1个主元,然后按这些主元与原各局部有序中的元素之间的偏序关系,将各个局部有序段划分成p段,接着通过全局交换将各个段中的对应部分集合在一起,最后将这些集合在一起的各部分采用多路归并的方法进行排序,这些有序段汇合起来就自然成为全局有序序列了。

1.3.2 PSRS算法形式化描述设有n个数据,P个处理器,以及均匀分布在P个处理器上的n个数据。

则PSRS算法可描述如下:算法13.5 PSRS排序算法输入:n个待排序的数据,均匀地分布在P个处理器上输出:分布在各个处理器上,得到全局有序的数据序列Begin(1) 每个处理器将自己的n/P个数据用串行快速排序(Quicksort),得到一个排好序的序列;(2) 每个处理器从排好序的序列中选取第w,2w,3w,…,(P-1)w个共P-1个数据作为代表元素,其中w=n/P2;(3) 每个处理器将选好的代表元素送到处理器P0中,并将送来的P段有序的数据序列做P路归并,再选择排序后的第P-1,2(P-1),…,(P-1)(P-1)个共P-1个主元;(4) 处理器P0将这P-1个主元播送到所有处理器中;w为处(5) 每个处理器根据上步送来的P-1个主元把自己的n/P个数据分成P段,记ji 理器P i的第j+1段,其中i=0,…,P-1,j=0,…,P-1;(6) 每个处理器送它的第i+1段给处理器P i,从而使得第i个处理器含有所有处理器的第i段数据(i=0,…,P-1);(7) 每个处理器再通过P路归并排序将上一步的到的数据排序;从而这n个数据便是有序的。

End在该算法中,针对其中的计算部分⑴中的快速排序的代价为O(k log k),其中k=n/p;第⑵步中各个处理器选择P个主元的代价为O(P);⑶中对P2个主元进行归并并选取新的主元所需代价为O(P2+log P);⑸中对数据划分的代价为O(P+n/p);最后第⑺步中各个处理器进行并行归并的代价为O(n/p+log P)。

针对通信部分⑶中处理器P0收集P2个主元的代价为O(P2);(4)中播送新选择的P个主元的代价为O(P);最后第(6)步的多对多播送的通信复杂度与具体的算法实现相关,其最大不会超过O(n)。

MPI源程序请参见章末附录。

1.4 小结本章主要讨论了几个典型的并行排序算法,关于枚举匹配算法的具体讨论可参考[1];快速排序算法可以参考文献[2]和[3]中的介绍;文献[4]和[5]讨论了PSRS排序算法。

参考文献[1].Chabbar E, Controle, gestion du parallelisme: tris synchrones et asynchrones. ThesisUniversite de Franche-comte, France:1980[2].Lorin H. Sorting and sort systems. Don Mills, Ontario: Addison-Wesley, 1975, 347~365[3].陈国良编著. 并行算法的设计与分析(修订版). 高等教育出版社, 2002.11[4].Shi H, Schaeffer J. Parallel Sorting by Regular Sampling. Journal of Parallel and DistributedComputing, 14(4), 1992[5].Li X, Lu P, Schaeffer J, Shillington J, Wong P S, Shi H. On the Versatility of Parallel Sortingby Regular Sampling. Parallel Computing, 19, 1993附录PSRS算法MPI源程序1. 源程序psrs_sort.c#include <stdio.h>#include <stdlib.h>#include <mpi.h>#define INIT_TYPE 10#define ALLTOONE_TYPE 100 #define ONETOALL_TYPE 200 #define MULTI_TYPE 300#define RESULT_TYPE 400#define RESULT_LEN 500#define MULTI_LEN 600int Spt; long DataSize;int *arr,*arr1;int mylength;int *index;int *temp1;main(int argc,char* argv[]) {long BaseNum = 1;int PlusNum;int MyID;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&MyID);PlusNum=60;DataSize = BaseNum*PlusNum;if (MyID==0)printf("The DataSize is :%lu\n",PlusNum);Psrs_Main();if (MyID==0)printf("\n");MPI_Finalize();}Psrs_Main( ){int i,j;int MyID,SumID;int n,c1,c2,c3,c4,k,l;FILE * fp;int ready;MPI_Status status[32*32*2];MPI_Request request[32*32*2];MPI_Comm_rank(MPI_COMM_WORLD,&MyID);MPI_Comm_size(MPI_COMM_WORLD,&SumID);Spt = SumID-1;/*初始化参数*/arr = (int *)malloc(2*DataSize*sizeof(int));if (arr==0)merror("malloc memory for arr error!");arr1 = &arr[DataSize];if (SumID>1){temp1 = (int *)malloc(sizeof(int)*SumID*Spt);if (temp1==0) merror("malloc memory fortemp1 error!");index = (int *)malloc(sizeof(int)*2*SumID);if (index==0) merror("malloc memory forindex error!");}MPI_Barrier( MPI_COMM_WORLD);mylength = DataSize / SumID;srand(MyID);printf("This is node %d \n",MyID);printf("On node %d the input data is:\n",MyID); for (i=0;i<mylength;i++){arr[i] = (int)rand();printf("%d : ",arr[i]);}printf("\n");/*每个处理器将自己的n/P个数据用串行快速排序(Quicksort),得到一个排好序的序列,对应于算法13.5步骤(1)*/MPI_Barrier( MPI_COMM_WORLD); quicksort(arr,0,mylength - 1);MPI_Barrier( MPI_COMM_WORLD);/*每个处理器从排好序的序列中选取第w,2w,3w,…,(P-1)w个共P-1个数据作为代表元素,其中w=n/P*P,对应于算法13.5步骤(2)*/if (SumID>1){MPI_Barrier(MPI_COMM_WORLD);n = (int)(mylength/(Spt+1));for (i=0;i<Spt;i++)temp1[i] = arr[(i+1)*n-1];MPI_Barrier(MPI_COMM_WORLD);if (MyID==0){/*每个处理器将选好的代表元素送到处理器P0中,对应于算法13.5步骤(3)*/j = 0;for (i=1;i<SumID;i++)MPI_Irecv(&temp1[i*Spt],sizeof(int)*Spt,MPI_CHAR,i,ALLTOONE_TYPE+i,MPI_COMM_WORLD,&request[j++]);MPI_Waitall(SumID-1, request,status);/* 处理器P0将上一步送来的P段有序的数据序列做P路归并,再选择排序后的第P-1,2(P-1),…,(P-1)(P-1)个共P-1个主元,,对应于算法13.5步骤(3)*/MPI_Barrier(MPI_COMM_WORLD);quicksort(temp1,0,SumID*Spt-1);MPI_Barrier(MPI_COMM_WORLD);for (i=1;i<Spt+1;i++)temp1[i] = temp1[i*Spt-1];/*处理器P0将这P-1个主元播送到所有处理器中,对应于算法13.5步骤(4)*/MPI_Bcast(temp1,sizeof(int)*(1+Spt),MPI_CHAR, 0,MPI_COMM_WORLD);MPI_Barrier(MPI_COMM_WORLD);}else{MPI_Send(temp1,sizeof(int)*Spt,MPI_CHAR,0,ALLTOONE_TYPE+MyID,MPI_COMM_WORLD);MPI_Barrier(MPI_COMM_WORLD);MPI_Barrier(MPI_COMM_WORLD);MPI_Bcast(temp1,sizeof(int)*(1+Spt),MPI_CHAR, 0,MPI_COMM_WORLD);MPI_Barrier(MPI_COMM_WORLD);}/*每个处理器根据上步送来的P-1个主元把自己的n/P个数据分成P段,记为处理器Pi的第j+1段,其中i=0,…,P-1,j=0,…,P-1,对应于算法13.5步骤(5)*/n = mylength;index[0] = 0;i = 1;while ((arr[0]>=temp1[i])&&(i<SumID)) {index[2*i-1] = 0;index[2*i] = 0;i++;}if (i==SumID)index[2*i-1] = n;c1 = 0;while (i<SumID){c4 = temp1[i];c3 = n;c2 = (int)((c1+c3)/2);while ((arr[c2]!=c4)&&(c1<c3)){if (arr[c2]>c4){c3 = c2-1;c2 = (int)((c1+c3)/2);}else{c1 = c2+1;c2 = (int)((c1+c3)/2);}}while ((arr[c2]<=c4)&&(c2<n))c2++;if (c2==n){index[2*i-1] = n;for (k=i;k<SumID;k++){index[2*k] = 0;index[2*k+1] = 0;}i = SumID;}else{index[2*i] = c2;index[2*i-1] = c2;}c1 = c2;c2 = (int)((c1+c3)/2);i++;}if (i==SumID)index[2*i-1] = n;MPI_Barrier( MPI_COMM_WORLD);/*每个处理器送它的第i+1段给处理器Pi,从而使得第i个处理器含有所有处理器的第i段数据(i=0,…,P-1),,对应于算法13.5步骤(6)*/j = 0;for (i=0;i<SumID;i++){if (i==MyID){temp1[i] = index[2*i+1]-index[2*i];for (n=0;n<SumID;n++)if (n!=MyID){k = index[2*n+1]-index[2*n];MPI_Send(&k,sizeof(int),MPI_CHAR,n,MULTI_LEN+MyID,MPI_COMM_WORLD);}}else{MPI_Recv(&temp1[i],sizeof(int), MPI_CHAR,i,MULTI_LEN+i,MPI_COMM_WORLD,&status[j++]);}}MPI_Barrier(MPI_COMM_WORLD);j = 0;k = 0;l = 0;for (i=0;i<SumID;i++){MPI_Barrier(MPI_COMM_WORLD);if (i==MyID){for (n=index[2*i];n<index[2*i+1];n++)arr1[k++] = arr[n];}MPI_Barrier(MPI_COMM_WORLD);if (i==MyID){for (n=0;n<SumID;n++)if (n!=MyID){MPI_Send(&arr[index[2*n]],sizeof(int)*(index[2*n+1]-index[2*n]),MPI_CHAR,n,MULTI_TYPE+MyID,MPI_COMM_WORLD);}}else{l = temp1[i];MPI_Recv(&arr1[k],l*sizeof(int),MPI_CHAR,i ,MULTI_TYPE+i,MPI_COMM_WORLD,&status[j++]);k=k+l;}MPI_Barrier(MPI_COMM_WORLD);}mylength = k;MPI_Barrier(MPI_COMM_WORLD);/*每个处理器再通过P路归并排序将上一步的到的数据排序;从而这n个数据便是有序的,,对应于算法13.5步骤(7)*/k = 0;multimerge(arr1,temp1,arr,&k,SumID);MPI_Barrier(MPI_COMM_WORLD);}printf("On node %d the sorted data is :\n",MyID);for (i=0;i<mylength;i++)printf("%d : ",arr[i]);printf("\n");}/*输出错误信息*/ merror(char* ch){printf("%s\n",ch);exit(1);}/*串行快速排序算法*/quicksort(int *datas,int bb,int ee){int tt,i,j;t = datas[bb];= bb;j = ee;if (i<j){while(i<j){while ((i<j)&&(tt<=datas[j]))j--;if (i<j){datas[i] = datas[j];i++;while ((i<j)&&(tt>datas[i]))i++;if (i<j){datas[j] = datas[i];j--;if (i==j)datas[i] = tt;}elsedatas[j] = tt;}elsedatas[i] = tt;}quicksort(datas,bb,i-1);quicksort(datas,i+1,ee);}}/*串行多路归并算法*/multimerge(int *data1,int *ind,int *data,int *iter,int SumID){int i,j,n;j = 0;for (i=0;i<SumID;i++)if (ind[i]>0){ind[j++] = ind[i];if (j<i+1) ind[i] = 0;}if ( j>1 ){n = 0;for (i =0;i<j,i+1<j;i=i+2){merge(&(data1[n]),ind[i],ind[i+1],&(data[n]));ind[i] += ind[i+1];ind[i+1] = 0;n += ind[i];}if (j%2==1 )for (i=0;i<ind[j-1];i++)data[n++]=data1[n];(*iter)++;multimerge(data,ind,data1,iter,SumID);}}merge(int *data1,int s1,int s2,int *data2){int i,l,m;l = 0;m = s1;for (i=0;i<s1+s2;i++){if (l==s1)data2[i]=data1[m++];elseif (m==s2+s1)data2[i]=data1[l++];elseif (data1[l]>data1[m])data2[i]=data1[m++];elsedata2[i]=data1[l++];}}2. 运行实例编译:mpicc psrs_sort.c –o psrs运行:可以使用命令mpirun –np SIZE psrs来运行该串匹配程序,其中SIZE是所使用的处理器个数,本实例中使用了SIZE=3个处理器。

相关文档
最新文档