计算机体系结构-第8章-并行算法课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《计算机体系结构-第8章-并行算法课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机体系结构 并行 算法 课件
- 资源描述:
-
1、第第8 8章章 并行算法并行算法 第第8章章 并行算法并行算法 8.1 并行算法的基础知识并行算法的基础知识 8.2 同步技术同步技术 8.3 程序并行性的分析程序并行性的分析 8.4 并行编程概述并行编程概述 8.5 并行编程模型并行编程模型 第第8 8章章 并行算法并行算法 8.1 并行算法的基础知识并行算法的基础知识 8.1.1 并行算法的定义和分类 1.并行算法的定义 算法是指解题方法的精确描述,是一组有穷的规则,它们规定了解决某一特定类型问题的一系列运算。并行算法(parallel algorithm)是指一些可同时执行的诸进程的集合,这些进程相互作用和协调动作从而达到给定问题的求解
2、。第第8 8章章 并行算法并行算法 2.并行算法的分类 并行机的出现来源于实际应用程序中存在内在并行度这一基本事实,因此,应用程序中是否存在可挖掘并行度是并行计算机应用的关键,而并行算法作为应用程序开发的基础,自然在并行计算机应用中具有举足轻重的地位。并行算法根据运算基本对象的不同可分为数值并行算法和非数值并行算法。第第8 8章章 并行算法并行算法 u 数值计算是指基于代数关系运算的一类诸如矩阵运算、多项式求值、求解线性方程组等数字计算问题。主要为数值计算方法而设计的并行算法称为数值并行算法(numerical parallel algorithm)。u 非数值计算是指基于比较关系运算的一类诸
3、如排序、选择、搜索、匹配等符号处理问题。主要为符号运算而设计的并行算法称为非数值并行算法(non-numerical parallel algorithm)。如神经网络算法、遗传算法等。第第8 8章章 并行算法并行算法 根据并行进程间相互执行顺序关系的不同可分为同步并行算法、异步并行算法和独立并行算法。同步并行算法(synchronized parallel algorithm)是指算法的诸进程间由于运算执行顺序而必须相互等待的并行算法。如通常的向量算法、SIMD算法及MIMD并行机上进程间需要相互等待通信结果的算法等。第第8 8章章 并行算法并行算法 异步并行算法(asynchronized
4、 parallel algorithm)是指算法的诸进程间执行相对独立,不需要相互等待的一种算法。通常对消息传递MIMD并行机进行设计,其主要特征是在计算的整个过程中均不需要等待,而是根据最新消息决定进程的继续或终止。独立并行算法(independent parallel algorithm)是指算法的诸进程间执行完全独立,计算的整个过程不需要任何通信的并行算法。例如气象预报应用中通常需要同时计算多个模型,以保证预报的实时性。第第8 8章章 并行算法并行算法 根据各处理机承担的计算任务粒度的不同,可分为细粒度并行算法、中粒度并行算法和粗粒度并行算法。细粒度并行算法(fine grain par
5、allel algorithm)通常指基于向量和循环级并行的算法。中粒度并行算法(middle grain parallel algorithm)通常指基于较大的循环级并行,且并行的好处足以弥补并行带来的额外开销的算法。粗粒度并行算法(coarse grain parallel algorithm)通常指基于子任务级并行的算法,例如通常的基于区域分解的并行算法,它们是当前并行算法设计的主流。第第8 8章章 并行算法并行算法 8.1.2 进程中的同构性 如前所述,并行算法是对一些可同时执行的诸进程之间相互关系的描述,因此,我们这里先讨论进程中的同构性,再来介绍并行算法的表达方法。进程中的同构性是
6、指在执行并行程序时,并行机中各处理机执行的进程相似到何种程度。图8.1描述了程序执行时进程中的同构性。第第8 8章章 并行算法并行算法 多处理机 程序 多数据流 执行级 MPMD 相同指令 相同程序 SIMD SPMD 图8.1 进程中的同构性第第8 8章章 并行算法并行算法 在多程序多数据流(MPMD)程序中的分进程是异构的,因为多个进程可以执行不同的程序代码;在单程序多数据流(SPMD)程序中的分进程是同构的,因为多个进程在不同的数据范畴内执行相同的程序代码,但不需在指令级达到同步;在单指令多数据流(SIMD)程序中的分进程是同构的,并且要求所有分进程必须在同一时间执行相同的指令。也就是说
7、,SIMD程序是SPMD程序的一个特例。MPMD和SPMD程序在执行时,由于各分进程在同一时间执行的是不同的指令,同时产生多个数据流,因此这两者均属于MIMD类型的程序。第第8 8章章 并行算法并行算法 8.1.3 并行算法的表达 描述一个算法,可以使用自然语言进行物理描述,也可用某种编程语言进行形式化描述。语言的选用,应避免二义性,且力图直观、易懂而不苛求严格的语法格式。像描述串行算法所选用的语言一样,类Algol、Pidgin-Algol、类Pascal、类C等语言均可选用。在这些语言中,允许使用的任何数据类型都可引进。在描述并行算法时,所有描述串行算法的语句及过程调用等均可使用,如数组、
8、集合、记录等等。根据进程中的同构性不同,对并行算法的表达采用了不同的并行语句。第第8 8章章 并行算法并行算法 1.par语句 当算法的若干个进程要并行执行时,可使用par语句进行描述。其格式如下:parbegin S1;S2;Sn;parend par语句主要用来描述MPMD的功能并行性,其中S1,S2,Sn是分进程,它们可含不同代码。当par语句执行时,它的n个分进程S1,S2,Sn就开始同时执行。它们的执行是互相独立的而且以不同的速率进行。当所有n个分进程终止时,par语句也就终止。第第8 8章章 并行算法并行算法 2.parfor语句 当par语句中的所有分进程共享相同的程序代码时,可
9、使用parfor语句进行描述。其格式如下:parfor(i=1;i=n;i+)/类C语言/process(i);或第第8 8章章 并行算法并行算法 parfor i:=1 to n do /类Pascal语言/begin process(i);end;parfor语句用来描述SPMD的数据并行性,其中process(i)表示某一个进程。尽管所有的进程都执行相同的程序代码,但各进程所需的参数是不相同的。第第8 8章章 并行算法并行算法 3.forall语句 当parfor语句中的所有分进程被分派到指定的处理机上并行执行时,可使用forall语句进行描述。其格式如下:第第8 8章章 并行算法并行算
10、法 forall(i=1;i=k;i+)/类C语言/process(i);或 for all Pi where 0ik do /类Pascal语言/process(i);end for;第第8 8章章 并行算法并行算法 8.2 同步技术同步技术 同步是个丰富的概念,且是个活跃的研究课题,跨越了许多计算机领域。在多门课程中,例如计算机系统结构、数据库、操作系统、并行处理以及编程语言都涉及到同步。在学习同步概念时,以下4个方面必须弄清楚:(1)用户面临的同步问题,如互斥、原子性、生产者和消费者问题、哲学家就餐问题及路障同步等。第第8 8章章 并行算法并行算法 (2)用户用来解决同步问题的语言结构。
11、这种结构可以是新语言构造、库函数或编译制导等形式。在目前共享存储器编程环境中,流行的结构是锁、信号量(若只有两个状态就是锁)、事件、临界区和路障等。这些构造称为高级构造。(3)在多处理机体系结构中可用的同步原语,例如Decrement/Increment、Test-and-Set、Compare-and-Swap、Fetch-and-Add等,它们常常由系统硬件直接提供,因此称为低级构造。(4)用低级同步构造实现高级同步构造的算法。在目前的许多系统中,锁仍是最基本的构造,以它为基础可构筑其它构造。第第8 8章章 并行算法并行算法 一般而言,同步操作可分为三类:原子性、控制同步和数据同步。详细的
12、层次结构如图8.2所示。当前的多处理机编程模型都支持路障、互斥、信号量和锁,以及生产者和消费者同步,但它们不能很好地支持原子性和“我找到了”同步。所有在共享存储器的机器(PVP、SMP、DSM等)中的同步通常使用锁原语实现,而在分布存储器的机器(MPP和机群)中的同步使用消息传递原语实现。第第8 8章章 并行算法并行算法 同步 原子性 控制同步 数据同步 路障 “我找到了”互斥 信号量和锁 生产者和消费者 池,队列 图8.2 各种同步类型第第8 8章章 并行算法并行算法 8.2.1 原子性 原子性(atomicity)是指一个进程需要以单原子操作方式加以执行。一个原子操作是指有如下特性的一种操
13、作。(1)不可分:从程序员的观点看,原子操作作为单一、不可分的一步来执行,一旦开始便不可在中间加以中断,即其它进程无法见到其中间状态,仅仅原子操作最后的结果对其它进程是可见的。如果由于某种原因使原子操作中途放弃,那么必须消除已执行部分操作的影响,卷回到原子操作的初始状态。第第8 8章章 并行算法并行算法 (2)有限:一旦启动原子操作,它将在有限时间内执行完。(3)可顺序化:不可分性质的推论是可顺序化。意思是说当几个原子操作并行执行时,最后的结果就如同这些操作按某种任意的次序一个接一个地执行所得到的结果一样。如以下代码所示:parfor(i=1;i=n;i+)atomic x=x+1;y=y-1
14、;第第8 8章章 并行算法并行算法 此例中,尽管x=x+1;y=y-1;是串行操作的,atomic将以上两条语句强制捆绑在一起,使其同时输出,达到同步。关键字atomic表示n个进程中的每一个必须以原子操作方式执行两条赋值语句。由并行系统强制原子性方式完成隐式同步。第第8 8章章 并行算法并行算法 8.2.2 控制同步 执行控制同步(control synchronization)操作的进程将处于等待状态,直到程序的执行到达某种控制状态。控制同步有路障、“我找到了”(eureka)和互斥(multual exclusive)等三种。路障同步是为了保证一组进程全都到达某一控制点后再继续执行。“我
15、找到了”同步则与路障同步完全相反,当某个进程到达某一控制点时,立即异步通知其它所有进程,而勿需处于等待状态。互斥是通过各进程互斥地执行临界段的内容,来保证对共享数据读写的正确性,从而实现同步的技术。下面我们主要介绍路障同步和互斥。第第8 8章章 并行算法并行算法 1.路障同步 路障同步是通过设置路障来达到同步的,如以下代码所示:parfor(i=1;i=n;i+)Pi;barrier;Qi;代码中有n个进程。执行Pi的第i个进程后跟一个barrier(路障同步),在其之后是Qi。当执行完Pi并到达barrier语句时,它必须处于等待状态,直到所有其它进程也到达了它们各自的路障时,才开始并行执行
16、Qi。第第8 8章章 并行算法并行算法 2.互斥 在实现互斥操作时,各处理机处理的相同代码段具有原子性且各处理机只能串行执行这一代码段。一个互斥操作是指有如下特性的一种操作。(1)互斥:每个时刻,仅允许一个进程执行临界段。(2)保证前进:如果多个进程试图进入临界区执行它们的临界段程序,那么至少有一个进程最后获得成功。换句话说,程序不会出现死锁或活锁。(3)无饥饿:企图执行临界段的进程最后应该获得成功,它不会由于其它进程的协同作用而处于饥饿状态。如以下代码所示:第第8 8章章 并行算法并行算法 parfor(i=1;i=n;i+)/有n个进程/每个进程执行一个parfor迭代/while CON
17、DITION independent computation,noncritical section /独立计算,非临界区/critical /互斥代码进入点/critical section /退出互斥代码段/independent computation,noncritical section 第第8 8章章 并行算法并行算法 临界段(critical section)是应以互斥方式执行的代码段。CONDITION是可以被临界区修改的逻辑表达式,关键字critical指明了临界区(critical region)。应注意临界区是互斥的,因为每次只允许一个进程执行临界段的内容。与此相反,只要
18、原子性是强制的,多个进程就可执行它们自己的原子区。但两者的时间复杂度是相同的,均为O(n),其中n为进程的个数。第第8 8章章 并行算法并行算法 8.2.3 数据同步 执行一个数据同步(data synchronization)操作的进程将处于等待状态,直到程序执行到达某种数据状态。数据同步的例子包括信号量和锁(semaphore&lock)、生产者和消费者(producer&consumer)、池和队列(pool&queue)等。在大多数当今的系统中,都用数据同步来实现原子性。如以下代码所示:第第8 8章章 并行算法并行算法 parfor(i=1;i=n;i+)lock(S);x=x+1;y
19、=y-1;unlock(S);其中锁同步依赖于信号量S中的数据状态。控制同步只依赖于程序的控制状态,它不受程序数据状态的影响。数据同步使用时非常灵活,但控制同步通常要比数据同步更容易理解。第第8 8章章 并行算法并行算法 8.4 并行编程概述并行编程概述 8.4.1 并行编程概况 对于所希望的应用,很多现存的并行代码似乎是不存在的,即使有,也常不能用于用户的并行机上,因为并行代码原来都是为不同的并行结构(如SMP、MPP等)而写的。第第8 8章章 并行算法并行算法 并行编程的问题是:(1)并行算法范例至今尚不能被很好地理解和广泛地接受;(2)并行编程是建立在不同的计算模型(PRAM模型、异步P
20、RAM模型、BSP模型、logP模型、C3模型)上的,而它们没有谁能象冯诺依曼模型那样被普遍的接受和认可;(3)绝大部分被使用的并行编程语言都是Fortran和C的推广,它们都不能充分地表达不同并行结构的特点,既不成熟也不通用;(4)并行编程工具依赖于具体的并行机结构和计算机的更迭,既不通用也不稳定,在某个平台上开发的并行程序,很难移植到别的或将来的并行机上。第第8 8章章 并行算法并行算法 尽管并行编程问题很多,但也有不少进展:(1)已经开发了很多并行算法,虽然它们大多基于理想的PRAM(Parallel Random-Access Machine)模型,但有些已被实际采用;(2)少量的并行
21、算法范例已出现,并且正逐渐被接受;(3)编程类型渐趋汇聚于两类:用于PVP、SMP和DSM的共享变量的单地址空间模型和用于MPP和机群的消息传递的多地址空间模型,SIMD模型已退出主流,但对专用领域(如信号、图像处理,多媒体处理等)仍是有用的;(4)并行编程模型渐趋汇聚于三类标准模型:数据并行(如HPF),消息传递(如PVM和MPI)和共享变量(如ANSI和X3H5)。在表8.1中,将并行编程所获得的进展在五个方面与串行编程进行了比较。第第8 8章章 并行算法并行算法 表8.1 串行编程和并行编程比较一览表 串行编程并行编程应用领域科学和工程计算,数据处理,商务应用等算法范例分而治之,分枝限界
22、,动态规划,回溯,贪心计算交互,异步迭代,分而治之,流水线,进程农庄,工作池编程模型冯诺依曼隐式并行、数据并行、共享变量、消息传递编程语言Fortran,C,Cobol,4GLKAP,Fortran90,HPF,X3H5,PVM,MPI体系结构不同类型的单处理机共享内存(PVP,SMP,DSM)数据并行(SIMD)消息传递(MPP,Cluster)第第8 8章章 并行算法并行算法 8.4.2 并行编程方法 现今编程模型主要有隐式并行、数据并行、消息传递和共享变量等四种。当在实际的并行机上根据它们设计并行程序时,绝大部分均是采用扩展Fortran和C语言的方法。目前有三种扩展的方法:(1)库函数
23、(library subroutines)法:除了串行语言所包含的库函数外,一组新的支持并行性和交互操作的库函数(如MPI消息传递库和POSIX Pthreads多线程库)引入到并行编程中;(2)新语言构造(new language constructs)法:采用某些新的语言构造来帮助并行编程以支持并行性和交互操作(如Fortran 90中的聚集数组操作);(3)编译制导(compiler directives)法:编程语言保持不变,但是加进称之为编译制导(pragma)的格式注释。第第8 8章章 并行算法并行算法 图8.4中用一段简单代码来说明这些方法。所有3个并行程序均执行相同的如图8.4
24、(a)所示的串行C代码的计算。图8.4(b)使用库函数的方法实现之,其中两个循环由p个进程并行执行,两个库函数my_process_id()和number_of_processes()开拓并行性,barrier()函数确保第一个循环执行后所有进程被同步,这样第二个循环能使用第一个循环更新后的数组A的正确值;第第8 8章章 并行算法并行算法 图8.4 三种并行化方法 for(i=0;iN;i+)Ai=Bi*Bi+1;for(i=0;iN;i+)Ci=Ai+Ai+1;图(a)顺序化代码段 id=my_process_id();p=number_of_processes();for(i=id;iN;
25、i=i+p)Ai=Bi*Bi+1;barrier();/路障同步,解决先写后读的数据相关/for(i=id;iN;i=i+p)Ci=Ai+Ai+1;图(b)使用库函数的等效并行代码第第8 8章章 并行算法并行算法 图8.4(c)展示了使用新语言构造执行并行操作,Fortran 90数组赋值结构语句执行N个元素相乘,然后以一个赋值语句进行赋值,两个数组赋值之间无需显式同步,因为Fortran 90语句是松散同步的,即在下一语句开始执行之前,一条赋值语句的所有操作均已完成;图8.4(d)展示了编译制导法实现并行操作,并行pragma指示下一语句应并行执行,SGI的pfor指使系统并行执行下一循环,
展开阅读全文