第十四章分布存储系统并行编程.ppt
《第十四章分布存储系统并行编程.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被设计成使不同通信子中的通信是相互分开的,以及任何群集通信是与任何点对点通信分开的,即使它们是在
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十四 分布 存储系统 并行 编程
链接地址:https://www.31ppt.com/p-4826204.html