《分布存储系统并行编程.ppt》由会员分享,可在线阅读,更多相关《分布存储系统并行编程.ppt(126页珍藏版)》请在三一办公上搜索。
1、国家高性能计算中心(合肥),第十四章 分布存储系统并行编程,国家高性能计算中心(合肥),分布存储系统并行编程,14.1 基于消息传递的编程14.2 MPI并行编程14.3 PVM并行编程14.4 基于数据并行的并行编程14.5 HPF并行编程,国家高性能计算中心(合肥),基于消息传递的并行编程,1 消息传递库2 消息传递方式,国家高性能计算中心(合肥),1 消息传递库(Message-Passing Libraries),建议:一个终端用户在开发新的消息传递应用时使用MPI或PVM.原因是:MPI和PVM都是公用软件,易于得到 多数厂家支持,国家高性能计算中心(合肥),CMMD:是一个用于Th
2、inking Machines CM-5系统的消息传递库,其特点是基于主动消息(Active Message)机制在用户空间实现通信以减少通信延迟;Express:是一个支持点到点和群集通信以及并行I/O的程序设计环境;Nx:是为Intel MPP(例如,Hypercubes和 Paragon)开发的微核系统.现在已由用于Intel/Sandia ASCI TFLOPS 系统中的新的微核系统PUMA代替.Fortran-M:是对Fortran77的扩展,它在设计上既支持共享存储也支持消息传递,但当前只实现了对消息传递的支持.该语言提供了许多机制用于支持开发行为确定、模块化的并行程序.P4(Pa
3、rallel Programs for Parallel Processors):是一组宏和子程序,用于支持共享存储和消息传递系统中的程序设计,它可以移植到许多体系结构上.其它的消息传递软件系统还有Vertex,PARMACS,Zipcode,UNIFY和PICL等.,1 消息传递库(Message-Passing Libraries),国家高性能计算中心(合肥),在当前所有的消息传递软件中,最重要最流行的是MPI和PVM,它们能运行在所有的并行平台上,包括SMP和PVP.二者已经在Windows NT 和Windows 95这样的非Unix平台上实现.程序设计语言支持C,Fortran和Ja
4、va.在国产的三大并行机系列神威、银河和曙光上都实现了对MPI和PVM和支持.,1 消息传递库(Message-Passing Libraries),国家高性能计算中心(合肥),1.1 MPI(Message Passing Interface)简介,1 消息传递库(Message-Passing Libraries),目标:是提供一个实际可用的、可移植的、高效的和灵活的消息传递接口标准.MPI以语言独立的形式来定义这个接口库,并提供了与C、Fortran和Java语言的绑定.这个定义不包含任何专用于某个特别的制造商、操作系统或硬件的特性.由于这个原因,MPI在并行计算界被广泛地接受.,国家高
5、性能计算中心(合肥),MPI的实现 建立在厂家专用的环境之上IBM SP2的POE/MPL,Intel Paragon的OSF/Nx 公共的MPI环境:CHIMP Edinburg 大学LAN(Local Area Multicomputer)Ohio超级计算中心 MPICH Argonne国家实验室与Mississippi州立大学 MPICH是MPI在各种机器上的可移植实现,可以安装在几乎所有的平台上:PC 工作站 SMP MPP COW,1 消息传递库(Message-Passing Libraries),国家高性能计算中心(合肥),1.2 PVM(Parallel Virtual Mac
6、hine)简介开发时间:始于1989年开发单位:美国Tennessee大学、Oak Ridge国家实验室和Emory大学联合研制特点:具有较好的适应性、可扩展性、可移植性和易使用性等特点,源代码可以免费获取,现已被用户广泛采纳.现状:目前对它的研究和开发工作仍在各大学和研究机构进行.尽管已经有越来越多的人开始使用MPI,但PVM仍然是做并行处理最流行的软件之一.随着它的不断流行,已经被移植到PVP,SMP,MPP,工作站和PC组成的机群系统.,1 消息传递库(Message-Passing Libraries),国家高性能计算中心(合肥),PVM和MPI间的主要差别:(1)PVM是一个自包含的
7、系统,而MPI不是.MPI依赖于支持它的平台提供对进程的管理和I/O功能.而PVM本身就包含这些功能.(2)MPI对消息传递提供了更强大的支持.(3)PVM不是一个标准,这就意味着PVM可以更方便、更频繁地进行版本更新.MPI和PVM在功能上现在正趋于相互包含.例如,MPI-2增加了进程管理功能,而现在的PVM也提供了更多的群集通信函数.与MPI不同的是,1 消息传递库(Message-Passing Libraries),国家高性能计算中心(合肥),1.2 Message-Passing Modes,关于通信模式,用户需要理解的有三个方面:共有多少个进程?进程间如何同步?如何管理通信缓冲区?
8、现在的消息传递系统多使用三种通信模式:同步的消息传递(Synchronous Message Passing)阻塞的消息传递(Blocking Message Passing)非阻塞的消息传递(Nonblocking Message Passing),2 消息传递方式,国家高性能计算中心(合肥),2 消息传递方式,国家高性能计算中心(合肥),Process P:M=10;L1:send M to Q;L2:M=20;goto L1;,Process Q:L1:S=-100;L2:receive S from P;X=S+1;,例2.1 消息传递中的发送和接收缓冲,M 称为发送消息缓冲(send
9、 message buffer,or send buffer)S 称为接收消息缓冲(receive message buffer,or receive buffer),2 消息传递方式,国家高性能计算中心(合肥),三种通信模式的比较,2 消息传递方式,国家高性能计算中心(合肥),Process P:M=10;send M to Q;do some computation which does not change M;wait for M to be sent;M=20;,Process Q:S=-100;receive S from P;do some computation which d
10、oes not use S;wait for S to be received;X=S+1;,例2.2 非阻塞模式下,强制进程等待直到安全时再继续执行,非阻塞模式本身也会带来一些额外开销:作为临时缓冲区用的内存空间 分配缓冲区的操作 将消息拷入和拷出临时缓冲区 执行一个额外的检测和等待函数,2 消息传递方式,国家高性能计算中心(合肥),消息传递的特点:在消息传递模型中,一个并行应用由一组进程组成,每个进程的代码是本地的,只能访问私有数据,进程之间通过传递消息实现数据共享和进程同步.优点:用户可以对并行性的开发、数据分布和通信实现完全控制.缺点:要求程序员显式地处理通信问题,如,消息传递调用的位
11、置,数据移动,数据复制,数据操作,数据的一致性等等.对大多数科学计算程序来说,消息传递模型的真正困难还在于显式的域分解,也就是说,将对相应数据的操作限定在指定的处理器上进行,在每个处理器上只能看见整个分布数据的一部分.无法以渐进的方式、通过逐步将串行代码转换成并行代码而开发出来.大量的散布在程序各处的域分解要求整个程序由串行到并行的转换一次性实现,而共享存储方法允许在现有的串行代码中插入并行说明从而实现逐步转换.与之相比,这是消息传递的一个明显的缺点.,2 消息传递方式,国家高性能计算中心(合肥),分布存储系统并行编程,14.1 基于消息传递的编程14.2 MPI并行编程14.3 PVM并行编
12、程14.4 基于数据并行的并行编程14.5 HPF并行编程,国家高性能计算中心(合肥),MPI并行编程,1 MPI中的消息2 MPI中的消息信封3 MPI中的四种通信模式4 点对点的通信5 群集通信6 MPI扩展7 例子:计算Pi的MPI程序,国家高性能计算中心(合肥),1 MPI中的消息,第五讲,初始化MPI环境,得到缺省的进程组大小,得到每个进程在组中的编号,发送消息,接收消息,终止MPI环境,国家高性能计算中心(合肥),这个程序用以下并行C编译器mpcc来编译:,执行下列命令将可执行程序myprog加载到n个节点上:,mpcc myprog.c o myprog,MPIRUN mypro
13、g np n,MPI进程是重型的单线进程.它们拥有不同的地址空间.因此,一个进程不能直接访问另一个进程地址空间的中的变量.进程间的通信用消息传递来实现.,1 MPI中的消息,国家高性能计算中心(合肥),为什么MPI中的发送和接收操作要做得这么复杂呢?,MPI消息的组成:消息的内容(即,信的内容),称为消息缓冲(message buffer)消息的接收者(即,写在信封上面的东西),称为消息信封(message envelop),MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD)MPI_Recv(&N,1,MPI_INT,0,i,MPI_COMM_WORLD,&st
14、atus),send M to Q;receive S from P,1 MPI中的消息,国家高性能计算中心(合肥),考虑一个用C语言声明的由N个复数组成的数组 double A100假定进程P要把这个数组发送给进程Q:,例1 用MPI发送一个数据数组,1 MPI中的消息,国家高性能计算中心(合肥),1 MPI中的消息,国家高性能计算中心(合肥),MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD),子程序名,消息地址,消息长度,消息数据类型,接收进程标识号,消息标签,通信子,MPI_Send(buffer,count,datatype,destination,t
15、ag,communicator)(buffer,count,datatype)消息缓冲(destination,tag,communicator)消息信封,1 MPI中的消息,国家高性能计算中心(合肥),消息数据类型(message data types)通信子(communicators)通信操作(communication operations)虚拟拓扑(virtual topology),MPI的 四个重要概念:,1 MPI中的消息,国家高性能计算中心(合肥),理由有两个:一是支持异构计算 另一是允许非连续,非均匀内存区中的消息.异构计算(heterogeneous computing)
16、:指的是在由不同计算机,如工作站网络,组成的系统上运行应用程序.系统中的每台计算机可能由不同的厂商生产、使用不同的处理器和操作系统当这些计算机使用不同的数据表示时如何保证互操作性.,为什么需要定义消息数据类型?,1 MPI中的消息,国家高性能计算中心(合肥),1 MPI中的消息,国家高性能计算中心(合肥),例2 发送非连续数据项,double A100;MPI_Pack_size(50,MPI_DOUBLE,comm,国家高性能计算中心(合肥),在下面的消息中,假定每个双精度数有8字节长,一个字符是1字节,一个整型数是4字节.,例 3 在消息传递中发送一个混合数据类型,国家高性能计算中心(合肥
17、),例4 发送一数组的所有偶序数元素,double A100;MPI_Data_type EvenElements;.MPI_Type_vector(50,1,2,MPI_DOUBLE,国家高性能计算中心(合肥),说明:MPI_Type_vector(count,blocklength,stride,oldtype,&newtype)是构造导出数据类型的MPI例程.导出类型newtype由blocks的拷贝count份组成.每块(blocks)由已有的数据类型oldtype的blocklength份连续项的拷贝组成.stride定义每两个连续的块之间的oldtype元素个数.因此,(strid
18、e-blocklength)即是两个块之间的间隔.,1 MPI中的消息,国家高性能计算中心(合肥),消息缓冲(message buffer,简称buffer),在不同的消息传递使用场合有不同的含义.下面给出一些例子:消息缓冲指的是由程序员定义的应用程序的存储区域,用于存放消息的数据值.例如,在Send(A,16,Q,tag)中,缓冲A是在用户应用程序中声明的变量.该缓冲的起始地址在消息例程中被使用.消息缓冲也可以指由消息传递系统(而非用户)创建和管理的一些内存区,它用于发送消息时暂存消息.这种缓冲不在用户的应用程序中出现,有时被称为系统消息缓冲(或系统缓冲).MPI允许第三种可能的定义.用户可
19、以划出一定大小的内存区,作为出现在其应用中的任意消息的中间缓冲.,消息缓冲,1 MPI中的消息,国家高性能计算中心(合肥),考虑下列代码,由进程P传送一个存放在数组A中的消息M,到进程Q的数组B中.,例5 在一对进程间发送消息,1 MPI中的消息,国家高性能计算中心(合肥),Process P,A,M,Process P,A,M,S,Process P,A,M,T,(a)只使用用户缓冲,(b)使用系统缓冲S,(c)使用了用户级的临时缓冲T,Process P:double A2000000;send(A,32,Q,tag);,Process Q:double B32;recv(B,32,P,t
20、ag),国家高性能计算中心(合肥),用户如何来定义消息的接收者呢?在下面列出的MPI发送例程中,消息信封由三项组成.,MPI_Send(address,count,datatype,destination,tag,communicator),destination 域是一个整数,标识消息的接收进程.,消息标签(message tag),也称为消息类型(message type),是程序员用于标识不同类型消息、限制消息接收者的一个整数.,2 MPI中的消息信封,国家高性能计算中心(合肥),为什么要使用消息标签(Tag)?,未使用标签,使用了标签,为了说明为什么要用标签,我们先来看右面一段没有使用
21、标签的代码:这段代码打算传送A的前32个字节进入X,传送B的前16个字节进入Y.但是,如果消息B尽管后发送但先到达进程Q,就会被第一个recv()接收在X中.使用标签可以避免这个错误.,2 MPI中的消息信封,国家高性能计算中心(合肥),使用标签的另一个原因是可以简化对下列情形的处理.假定有两个客户进程P和R,每个发送一个服务请求消息给服务进程Q.,例6 在消息传递中使用标签,未使用标签,使用了标签,国家高性能计算中心(合肥),通信子(communicator):一个进程组(process group)+上下文(context).进程组:是进程的有限有序集.有限意味着,在一个进程组中,进程的个
22、数n是有限的,这里的n称为进程组的大小(group size).有序意味着n 个进程是按整数0,1,.,n-1进行编号的.一个进程在一个通信子(组)中用它的编号进行标识.组的大小和进程编号可以通过调用以下的MPI例程获得:MPI_Comm_size(communicator,&group_size)MPI_Comm_rank(communicator,&my_rank),什么是通信子?,2 MPI中的消息信封,MPI_Send(address,count,datatype,destination,tag,communicator),国家高性能计算中心(合肥),例7通信子的使用,2 MPI中的消
23、息信封,Process 0:MPI_Send(msg1,count1,MPI_INT,1,tag1,comm1);parallel_fft(.);Process 1:MPI_Recv(msg1,count1,MPI_INT,0,tag1,comm1);parallel_fft(.);,if(my_rank=0)MPI_Send(msg2,count1,MPI_INT,1,tag2,comm2);,含代码,含代码,国家高性能计算中心(合肥),存在问题:不可能保证tag1 和tag2一定取了不同的值:标签是由用户定义的整数值,用户可能会出错.即使用户不会弄错,也难以或不可能保证tag1 和tag2
24、有不同的值.函数parallel_fft()可能是由其它用户写的,或者它是一个库例程.这样,用户可能不知道tag2的值.即使用户总能知道tag2的值,仍然可能出错.因为MPI_Recv 例程可能决定使用一个通配的(wildcard)标签MPI_Any_tag.解决办法:在parallel_fft()中的通信使用不同的通信子,它可能包含相同的进程组(如,进程0和1),但每个通信子有系统指定的不同的上下文,与comm1的不同.因此,MPI_Recv 不再有偶然会从parallel_fft()的MPI_Send中接收msg2的危险了.,2 MPI中的消息信封,国家高性能计算中心(合肥),考虑如下由1
25、0个进程执行的代码:,例8 MPI中的新通信子,2 MPI中的消息信封,MPI_Comm MyWorld,SplitWorld;int my_rank,group_size,Color,Key;MPI_Init(,国家高性能计算中心(合肥),MPI_Comm_dup(MPI_COMM_WORLD,&MyWorld)将创建一个新的通信子MyWorld,它是包含与原始的MPI_COMM_WORLD相同的10个进程的进程组,但有不同的上下文.,2 MPI中的消息信封,国家高性能计算中心(合肥),MPI-1被设计成使不同通信子中的通信是相互分开的,以及任何群集通信是与任何点对点通信分开的,即使它们是在
26、相同的通信子内.通信子概念尤其方便了并行库的开发.MPI-1只支持组内通信(intra-communication)MPI-2支持组间通信(inter-communication),2 MPI中的消息信封,国家高性能计算中心(合肥),MPI消息特性的总结,发送者进程总结如下,例子:MPI_Send(第一个参数指明消息缓存的起始地址,即存放要发送的数据信息.第二个参数指明消息中给定的数据类型有多少项,这个数据类型由第三个参数给定.数据类型要么是基本数据类型,要么是导出数据类型,后者由用户生成指定一个可能是由混合数据类型组成的非连续数据项.第四个参数是目的进程的标识符(进程编号)第五个是消息标签第
27、六个参数标识进程组和上下文,即,通信子.通常,消息只在同组的进程间传送.但是,MPI允许通过intercommunicators在组间通信.,MPI_Send(buffer,count,datatype,destination,tag,communicator),国家高性能计算中心(合肥),发送者进程总结如下,例:MPI_Recv(&tmp,1,MPI_INT,i,i,MPI_COMM_WORLD,&Status),第一个参数指明接收消息缓冲的起始地址,即存放接收消息的内存地址第二个参数指明给定数据类型的最大项数,它存放在第三个参数内,可以被接收.接收到的实际项数可能少一些 第四个参数是源进程
28、标识符(编号)第五个是消息标签第六个参数标识一个通信子 第七个参数是一个指针,指向一个结构MPI_Status Status 存放了各种有关接收消息的各种信息.Status.MPI_SOURCE 实际的源进程编号Status.MPI_TAG 实际的消息标签 实际接收到的数据项数由MPI例程MPI_Get_count(&Status,MPI_INT,&C)读出.这个例程使用Status中的信息来决定给定数据类型(在这里是MPI_INT)中的实际项数,将这个数放在变量C中.,这两个域可以是wildcard MPI_Any_source和MPI_Any_tag.,MPI_Recv(address,c
29、ount,datatype,source,tag,communicator,status),国家高性能计算中心(合肥),当一个接收者能从不同进程接收不同大小和标签的信息时,状态信息就很有用.,例9 消息传递中的状态(Status)字,2 MPI中的消息信封,while(true)MPI_Recv(received_request,100,MPI_BYTE,MPI_Any_source,MPI_Any_tag,comm,国家高性能计算中心(合肥),用在MPI中的通信模式(communication mode)同步的(synchronous)直到相应的接收已经启动发送才返回,因此接收端要有存放到达
30、消息的应用缓冲.注意:在MPI中可以有非阻塞的同步发送,它的返回不意味着消息已经被发出!它的实现不需要在接收端有附加的缓冲,但需要在发送端有一个系统缓冲.为了消除额外的消息拷贝,应使用阻塞的同步发送.,3 MPI中的四种通信模式,国家高性能计算中心(合肥),缓冲的(buffered)缓冲的发送假定能得到一定大小的缓冲空间,它必须事先由用户程序通过调用子例程MPI_Buffer_attch(buffer,size)来定义,由它来分配大小为size的用户缓冲.这个缓冲可以用MPI_Buffer_detach(*buffer,*size)来实现.,3 MPI中的四种通信模式,国家高性能计算中心(合肥
31、),标准的(standard)发送可以是同步的或缓冲的,取决于实现.,就绪的(ready)在肯定相应的接收已经开始才进行发送.它不像在同步模式中那样需要等待.这就允许在相同的情况下实际使用一个更有效的通信协议.,3 MPI中的四种通信模式,国家高性能计算中心(合肥),4 点对点的通信,国家高性能计算中心(合肥),例10 使用消息传递的进程流水线,图中是一条三进程的流水线,一个进程连续地从左边接收一个输入数据流,计算一个新的值,将它发送给右边.下面的代码示出了基本思想.,进程Q的一段代码while(Not_Done)MPI_Irevc(NextX,.);MPI_Isend(PreviousY,.
32、);CurrentY=Q(CurrentX);,4 点对点的通信,国家高性能计算中心(合肥),进程Q的代码while(Not_Done)if(X=Xbuf0)X=Xbuf1;Y=Ybuf1;Xin=Xbuf0;Yout=Ybuf0;else X=Xbuf0;Y=Ybuf0;Xin=Xbuf1;Yout=Ybuf1;MPI_Irevc(Xin,.,recv_handle);MPI_Isend(Yout,.,send_handle);Y=Q(X);/*重迭计算*/MPI_Wait(recv_handle,recv_status);MPI_Wait(send_handle,send_status);
33、,4 点对点的通信,国家高性能计算中心(合肥),例11 发送和接收中的死锁,这是一段错误代码,可能会有下列结果:死锁.例程MPI_Issend是非阻塞的、同步的发送.它直到相应的MPI_Irecv 已经启动执行才返回,如果条件Y=5不为真,则MPI_Irecv就不会被执行.Y为0.假定当if语句被执行后Y=5为真.则MPI_Irecv会从进程P接收X的值(为0)到它的变量Y,并打印它.Y为5.另一个可能的情况是当Y=5为真时,打印会在接收到X的值并存入Y之前执行(因为MPI_Irecv是非阻塞的接收).因此打印出的是Y的旧值.,Process P:.X=0;MPI_Issend(,Proces
34、s Q.if(Y=5)MPI_Irecv(,4 点对点的通信,国家高性能计算中心(合肥),广播(Broadcast),MPI_Bcast(Address,Count,Datatype,Root,Comm),在下列broadcast操作中,标号为Root的进程发送相同的消息给标记为Comm的通信子中的所有进程.消息的内容如同点对点通信一样由三元组(Address,Count,Datatype)标识.对Root进程来说,这个三元组既定义了发送缓冲也定义了接收缓冲.对其它进程来说,这个三元组只定义了接收缓冲.,5 群集通信,国家高性能计算中心(合肥),聚集(Gather),MPI_Gather(Se
35、ndAddress,SendCount,SendDatatype,RecvAddress,RecvCount,RecvDatatype,Root,Comm),5 群集通信,播撒(Scatter),MPI_Scatter(SendAddress,SendCount,SendDatatype,RecvAddress,RecvCount,RecvDatatype,Root,Comm),国家高性能计算中心(合肥),MPI_ScatterScatter只执行与Gather相反的操作.Root进程发送给所有n个进程发送一个不同的消息,包括它自已.这n个消息在Root进程的发送缓冲区中按标号的顺序有序地存放
36、.每个接收缓冲由三元组(RecvAddress,RecvCount,RecvDatatype)标识.所有的非Root进程忽略发送缓冲.对Root进程,发送缓冲由三元组(SendAddress,SendCount,SendDatatype)标识.,5 群集通信,MPI_ GatherRoot进程从n个进程的每一个接收各个进程(包括它自已)的消息.这n个消息的连接按序号rank进行,存放在Root进程的接收缓冲中.每个发送缓冲由三元组(SendAddress,SendCount,SendDatatype)标识.所有非Root进程忽略接收缓冲.对Root进程,发送缓冲由三元组(RecvAddress
37、,RecvCount,RecvDatatype)标识.,国家高性能计算中心(合肥),扩展的聚集和播撒操作Allgather,MPI_Allgather(SendAddress,SendCount,SendDatatype,RecvAddress,RecvCount,RecvDatatype,Comm),5 群集通信,国家高性能计算中心(合肥),全局交换(Tatal Exchange),每个进程发送一个消息给所有n个进程,包括它自已.这n个消息在它的发送缓冲中以标号的顺序有序地存放.从另一个角度来看这个通信,每个进程都从n个进程接收一个消息.这n个消息以标号的顺序被连接起来,存放在接收缓冲中.注
38、意,全局交换等于由n 个不同进程做的n次Gather操作.因此,不再需要Root参数.所有对所有,在一次全局交换中共有n2个消息进行通信.,MPI_Alltoall(SendAddress,SendCount,SendDatatype,RecvAddress,RecvCount,RecvDatatype,Comm),5 群集通信,国家高性能计算中心(合肥),MPI提供了两种类型的聚合操作:归约(reduction)和扫描(scan).归约(reduction)MPI_Reduce(SendAddress,RecvAddress,Count,Datatype,Op,Root,Comm)这里每个进
39、程的部分值存放在SendAddress中.所有进程将这些值归约为最终结果并将它存入Root进程的RecvAddress.数据项的数据类型在Datatype域中定义.归约操作由Op域定义.,聚合(Aggregation),5 群集通信,国家高性能计算中心(合肥),扫描(scan)MPI_scan(SendAddress,RecvAddress,Count,Datatype,Op,Comm)scan操作省去了Root域,因为scan是将部分值组合成n个最终值,并存放在n个进程的RecvAddress.scan操作由Op域定义.MPI的reduction和scan操作允许每个进程贡献向量值,而不只是
40、标量值.向量的长度由Count定义.MPI支持用户自定义的reduction和scan操作,5 群集通信,国家高性能计算中心(合肥),在路障操作中,通信子Comm中的所有进程相互同步,即,它们相互等待,直到所有进程都执行了他们各自的MPI_Barrier函数.,路障(Barrier),MPI_Barrier(Comm),5 群集通信,国家高性能计算中心(合肥),5 群集通信,国家高性能计算中心(合肥),通信子中的所有进程必须调用群集通信例程.如果代码中只有通信子中的一部分成员调用了一个群集例程而其它没有调用,则是错误的.一个错误代码的行为是不确定的,意味着它可能发生任何事情,包括死锁或产生错误
41、的结果.一个进程一旦结束了它所参与的群集操作就从群集例程中返回.除了MPI_Barrier以外,每个群集例程使用类似于点对点通信中的标准(standard)、阻塞的通信模式.例如,当Root进程从MPI_Bcast中返回时,它就意味着发送缓冲的Address可以被安全地再次使用.其它进程可能还没有启动它们相应的MPI_Bcast!一个群集例程也许是也许不是同步的,取决于实现.MPI要求用户负责保证他的代码无论实现是否是同步的都是正确的.Count 和Datatype在所包含的所有进程中必须是一致的.在群集例程中没有tag参数.消息信封由通信子参数和源/目的进程定义.例如,在MPI_Bcast中
42、,消息的源是Root,目的是所有进程(包括Root).在MPI-1 中,只支持阻塞和通信子内(intra-communicator)群集通信.,群集例程的共同特点,5 群集通信,国家高性能计算中心(合肥),6 MPI扩展,MPI-2对MPI-1的扩展动态进程单边通信非阻塞群集通信模式和通信子间群集通信模式.对可扩展的I/O的支持,叫做MPI-IO.在MPI-1中,I/O问题全部忽略.MPI-1只定义对Fortran77和C语言的绑定.MPI-2将语言绑定扩展到Fortran90和C+.对实时处理的支持.扩展了MPI-1的外部接口,以便使环境工具的开发者更易于访问MPI对象.这将有助于开发剖析(
43、profiling)、监视(monitoring)和调试(debugging)工具.,国家高性能计算中心(合肥),动态进程 MPI-2决定支持动态进程,这带来了以下好处:MPI-1不定义如何创建进程和如何建立通信.因此,MPI-1需要支撑平台提供这种能力,像SP2中的POE和工作站网络中的rsh.MPI-2中的动态进程机制以可移植的方式(平台独立)提供了这种能力 动态进程有利于将PVM程序移植到MPI上.并且还可能支持一些重要的应用类型,如,Client/Server和Process farm.动态进程允许更有效地使用资源和负载平衡.例如,所用节点数可以按需要减少和增加 支持容错.当一个结点失
44、效,运行在其上的进程能在另一个结点上创建一个新进程完成其工作.,6 MPI扩展,国家高性能计算中心(合肥),这个函数试图派生maxprocs个子进程,每个子进程执行相同代码,这个代码在command_line中定义.如果MPI不能派生maxprocs个进程,它可以按minprocs指定的数目派生进程.如果它连minprocs个进程都派生不了,MPI_Spawn就返回一个出错代码.info 必须是一个空串,允许运行时系统决定何地、如何启动该进程.,6 MPI扩展,国家高性能计算中心(合肥),MPI_Spawn是一个群集操作,也就是说,通信子comm中的所有成员必须调用它派生进程.但是,只有roo
45、t进程中的参数command_line,minprocs,maxprocs,和info是有意义的,而忽略其它进程上的这些参数值.这样,尽管派生的进程可以看成comm中所有进程的子进程,但只有 root进程是真正的父进程.子进程是MPI进程意味着它们必须调用MPI_Initialize,它与父进程中的MPI_Spawn同是群集操作.子进程和父进程可以通过intercommunicator intercomm 进行通信,它从父进程中的MPI_Spawn返回,子进程通过调用MPI_parent函数能获得intercommunicator的句柄.MPI_parent函数的形式如下:int MPI_Pa
46、rent(MPI_Comm*intercomm),6 MPI扩展,国家高性能计算中心(合肥),单边通信 MPI-2包括一个新的点对点通信模式,叫做远程存储访问(remote memory access,RMA),它允许一个进程执行单边通信.即,一个进程可以发送一个数据值到一个目的地,也可以从一个数据源取一个数据值,无需另一边的参与.在MPI-1中,所有的点对点通信都是双边的,发送者和接收者都必需参与.,6 MPI扩展,国家高性能计算中心(合肥),int MPI_Get(void*dest_addr,MPI_Init dest_count,MPI_Datatype dest_datatype,i
47、nt source_rank,int source_disp,int source_count,MPI_Datatype source_datatype,MPI_Comm comm),单边接收(MPI_get),6 MPI扩展,国家高性能计算中心(合肥),int MPI_Put(void*source_addr,MPI_Init source_count,MPI_Datatype source_datatype,int dest_rank,int dest_disp,int dest_count,MPI_Datatype dest_datatype,MPI_Comm comm),单边发送(MP
48、I_Put),6 MPI扩展,国家高性能计算中心(合肥),7 例子:计算Pi的MPI程序,#include#include#include long n,/*number of slices*/i;/*slice counter*/double sum,/*running sum*/pi,/*approximate value of pi*/mypi,x,/*independent var.*/h;/*base of slice*/int group_size,my_rank;main(argc,argv)int argc;char*argv;,国家高性能计算中心(合肥),int group_
49、size,my_rank;MPI_Status status;MPI_Init(,国家高性能计算中心(合肥),编译:mpicc-o pi pi.c运行:mpirun-np 2 pi,7 例子:计算Pi的MPI程序,国家高性能计算中心(合肥),提纲,14.1 基于消息传递的编程14.2 MPI并行编程14.3 PVM并行编程14.4 基于数据并行的并行编程14.5 HPF并行编程,国家高性能计算中心(合肥),并行虚拟机(PVM),1 并行虚拟机的构造2 PVM中的进程管理3 PVM中的通信4 例子:计算Pi的PVM程序,国家高性能计算中心(合肥),1 并行虚拟机的构造,PVM系统的组成(两部分)
50、PVM监控进程(daemon),称为pvmd,它常驻在虚拟机的每个计算机上用户可调用的库,称为libpvm3.a,它与用户的应用程序链接,用于进程管理,消息传递和虚拟机管理.在PVM中,节点(a node)称为主机(a host).进程(a process)称为任务(a task).并行虚拟机的组成1多台主机(硬件)唯一1个master pvmd(系统软件),运行在称为控制台的主机上0多个slave pvmd(系统软件),国家高性能计算中心(合肥),PVM 控制台(Console)安装了PVM后,用户在任何一台主机上键入以下命令创建PVM控制台:pvm host_file这个命令执行成功后将在