国家973项目高性能计算环境支持讲座19140.docx
国家973项目高性能计算环境支持讲座MPI与PETSc莫则尧(北京应用用物理与与计算数数学研究究所)日期内容815上午进程与消息息传递、MPI应用用现状、MPI并行行程序设设计入门门、初步的MPPI消息息传递函函数下午作业一、讨讨论816上午作业一讲评评、先进的MPPI函数数、并行程序示示例2、MPI的发发展下午作业二、讨讨论817上午作业二讲评评、并行可扩展展科学计计算工具具箱PEETScc介绍下午PETScc程序示示例个人介绍莫则尧,男男,汉族族,19971年年7月生生,副研研究员:l 1992年年国防科科技大学学应用数数学专业业本科毕毕业;l 1997年年国防科科技大学学计算机机应用专专业并行行算法方方向博士士毕业;l 1999年年北京应应用物理理与计算算数学数数学博士士后流动动站出站站,并留留所工作作;l 主要从事大大规模科科学与工工程并行行计算研研究。消息传递并并行编程程环境MMPI一、 进程与消息息传递二、 MPI环境境的应用用现状三、 MPI并行行程序设设计入门门(程序序例1)四、 初步的MPPI消息息传递函函数五、 作业一六、 先进的MPPI函数数七、 MPI并行行程序示示例2(求求解-Du=ff);八、 MPI环境境的发展展九、 作业二一、进程与与消息传传递1单个进进程(pproccesss)l 进程是一个个程序,同同时包含含它的执执行环境境(内存存、寄存存器、程程序计数数器等),是是操作系系统中独独立存在在的可执执行的基基本程序序单位;l 通俗理解:串行应应用程序序编译形形成的可可执行代代码,分分为“指令”和“数据”两个部部分,并并在程序序执行时时“独立地地申请和和占有”内存空空间,且且所有计计算均局局限于该该内存空空间。进程1进程2 内存2单机内内多个进进程:l 多个进程可可以同时时存在于于单机内内同一操操作系统统:由操操作系统统负责调调度分时时共享处处理机资资源(CCPU、内内存、存存储、外外设等);l 进程间相互互独立(内存空空间不相相交):在操作作系统调调度下各各自独立立地运行行,例如如多个串串行应用用程序在在同一台台计算机机中运行行;l 进程间可以以相互交交换信息息:例如如数据交交换、同同步等待待,消息息是这些些交换信信息的基基本单位位,消息息传递是是指这些些信息在在进程间间的相互互交换,是是实现进进程间通通信的唯唯一方式式;l 最基本的消消息传递递操作:发送消消息(ssendd)、接接受消息息(reeceiive)、进进程同步步(baarriier)、规规约(rreduuctiion);l 消息传递的的实现:共享内内存或信信号量,用用户不必必关心; 进进程1 进程22 发送数数据 接收数数据 (消消息传递递) 内内存空间间3包含于于通过网网络联接接的不同同计算机机的多个个进程:l 进程独立存存在:进进程位于于不同的的计算机机,由各各自独立立的操作作系统调调度,享享有独立立的CPPU和内内存资源源;l 进程间相互互信息交交换:消消息传递递;l 消息传递的的实现:基于网网络soockeet机制制,用户户不必关关心;4消息传传递库函函数:l 应用程序接接口(AAPI):提供给给应用程程序(FFORTTRANN、C、CC+语语言)的的可直接接调用的的完成进进程间消消息传递递的某项项特定功功能的函函数;l 消息传递库库:所有有定义的的消息传传递函数数编译形形成的软软件库,调调用其内内部函数数的应用用程序,通通过与之之联接,即即可成为为可并行行执行的的程序;l 目前流行的的消息传传递函数数库:PPVM 3.33.111、MPPICHH 1.2、LLAMMMPI 6.44等;5标准消消息传递递界面(MMPI:Messsagge PPasssingg Innterrfacce):l MPI标准准:根据据应用程程序对消消息传递递功能的的需求,全全球工业业、应用用和研究究部门联联合推出出标准的的消息传传递界面面函数,不不考虑其其具体实实现,以以保证并并行应用用程序的的可移植植性;l MPI的具具体实现现:消息息传递库库函数,目目前有影影响的为为MPIICH和和LAMMMPII,我们们注重MMPICCH系列列;6基于消消息传递递的并行行程序执执行模式式:l SPMD模模式:单单程序多多数据流流并行应用程序代码 可执行行代码 运行复制多份并独立执行,形成多个独立的进程 进程三(内存)进程二(内存)进程一(内存)消息传递(交换数据、同步、规约)协同l MPMD模模式:多多程序多多数据流流,除初初始启动动多个可可执行代代码,其其余与SSPMDD模式一一致;7共享存存储与分分布式存存储:l 属于并行机机体系结结构的范范畴,与与消息传传递并行行程序设设计平台台无关; 节节点CPUCPU CPUCPUCPUCPUMMM互连网络互连网络MMM 分分布式存存储 共享享存储l 消息传递是是相对于于进程间间通信方方式而言言的,与与具体并并行机存存储模式式无关,任任何支持持进程间间通信的的并行机机,均可可支持消消息传递递并行程程序设计计;l 几乎所有共共享和分分布存储储并行计计算环境境均支持持进程间间的消息息传递通通信;二、MPII环境的的应用现现状l MPI(消消息传递递界面)是是全球工工业、政政府和科科研部门门联合推推出的适适合进程程间进行行标准消消息传递递的并行行程序设设计平台台,最初初版MPPI 11.0本本于19994年年6月推推出,目目前最新新的为MMPI 2.00版,于于19998年年年低推出出;l MPI的具具体实现现:MPPICHH和LAAMMPPI,目目前均已已实现MMPI 1.22版,适适用于任任何并行行计算平平台;部部分并行行机已实实现MPPI 22.0版版;l MPI是目目前应用用最广的的并行程程序设计计平台,几几乎被所所有并行行计算环环境(共共享和分分布式存存储并行行机、MMPP、机机群系统统等)和和流行的的多进程程操作系系统(UUNIXX、Wiindoows NT)所所支持,基基于它开开发的应应用程序序具有最最佳的可可移植性性;l 目前高效率率的超大大规模并并行计算算(10000个个处理器器)最可可信赖的的平台;l 工业、科学学与工程程计算部部门的大大量科研研和工程程软件(气气象、石石油、地地震、空空气动力力学、核核等)目目前已经经移植到到MPII平台,发发挥了重重要作用用;l 目前,MPPI相对对于PVVM:Ø 优点:功能能强大,性性能高,适适应面广广,使用用方便,可可扩展性性好;Ø 缺点:进程程数不能能动态改改变;三、MPII并行程程序设计计入门1 MPI并行行程序设设计平台台由标准准消息传传递函数数及相关关辅助函函数构成成,多个个进程通通过调用用这些函函数(类类似调用用子程序序),进进行通信信;2 MPI程序序:l SPMD执执行模式式:一个个程序同同时启动动多份,形形成多个个独立的的进程,在在不同的的处理机机上运行行,拥有有独立的的内存空空间,进进程间通通信通过过调用MMPI函函数来实实现;l 每个进程开开始执行行时,将将获得一一个唯一一的序号号(raank)。例例如启动动P个进进程,序序号依次次为0,11,P-1;l MPI程序序例1:进程00发送一一个整数数给进程程1;进进程1将将该数加加1,传传递给进进程2;进程22再将该该数加11,再传传递给进进程3;依次类类推,最最后,进进程P-1将该该数传递递给进程程0,由由进程00负责广广播该数数给所有有进程,并并打印输输出。 proograam exaamplle1 inncluude “mpiif.hh” ! MMPI系系统头文文件 inntegger sstattus(MPII_STTATUUS_SSIZEE),mmy_rrankk,p,souurcee,deest,tagg,ieerr,dattacc-进入MMPI系系统 caall MPII_Innit(ierrr) caall MPII_Coomm_rannk(MMPI_COMMM_WWORLLD,mmy_rrankk,ieerr) caall MPII_Coomm_sizze(MMPI_COMMM_WWORLLD,pp,ieerr)cc-数据交交换 daata=0 taag = 5 soourcce= my_rannk-11 iff(soourcce.eeq.-1) souurcee=p-1 deest =myy_raank+1 iff(deest.eq.p) desst=00 iff(myy_raank.eq.0) theen caall MPII_Seend(datta,11,MPPI_IINTEEGERR,deest,tagg,MPPI_CCOMMM_WOORLDD,ieerr) caall MPII_Reecv(datta,11,MPPI_IINTEEGERR,soourcce,ttag,MPII_COOMM_WORRLD,staatuss,ieerr) ellse caall MPII_Reecv(datta,11,MPPI_IINTEEGERR,soourcce,ttag,MPII_COOMM_WORRLD,staatuss,ieerr) daata=datta+11 caall MPII_Seend(datta,11,MPPI_IINTEEGERR,deest,tagg,MPPI_CCOMMM_WOORLDD,ieerr) enndiffcc-广播数数据 caall MPII_Bccastt(daata,1,MMPI_INTTEGEER,00,MPPI_CCOMMM_WOORLDD,ieerr)cc-打打印输出出 iff(myy_raank.eq.0) theen iff(daata.eq.p-11) tthenn prrintt *,”Succcesssfuul, datta=”,daata ellse prrintt *,”Faiilurre, datta=”,daata enndiff enndiffc ccalll MPPI_FFinaalizze(iierrr) eendl 编译命令: mmpiff77 -oo eexamm.e exxampple.f l 运行命令: mmpirrun np 4 exxam.e l 运行效果:MPII系统选选择相同同或不同同的4个个处理机机,在每每个处理理机上运运行程序序代码eexamm.e。 MPII函数 进进程0 进程11 进程程2 进进程3进入MPI系统 Innit() Comm_rannk() myy_raank=0 myyrannk=11 myrrankk=2 mmy_rrankk=3Comm_sizze() p=4 p=44 pp=4 pp=4 taag=55,daata=0 tagg=5,datta=00 ttag=5,ddataa=0 tagg=5,datta=00 soourcce=33 ssourrce=0 souurcee=1 souurcee=2 ddestt=1 desst=22 deest=3 ddestt=0数据交换 seend() reccv() reecv() reccv() rrecvv() ddataa=daata+1 空空 sennd() 闲闲 datta=ddataa+1 等等 ssendd() 待待 daata=datta+11 消消息传递递 ssendd()Broaddcasst() seend() reccv() reecv() reccv()退出MPI系统 ouutpuut “datta”Finallizee()3MPII重要概概念l 进程序号(rrankk);各各进程通通过函数数MPII_Coomm_rannk()获取各各自的序序号;l 消息号:消消息的标标号;l 通信器(CCommmuniicattor):1)理解为为一类进进程的集集合,且且在该集集合内,进进程间可可以相互互通信;类比:邮局、电电话局、国国际网;2)任任何MPPI通信信函数均均必须在在某个通通信器内内发生;3) MPII系统提提供省缺缺的通信信器MPPI_CCOMMM_WOORLDD,所有有启动的的MPII进程通通过调用用函数MMPI_Iniit()包含在在该通信信器内;4)各各进程通通过函数数MPII_Coomm_sizze()获取通通信器包包含的(初始启启动)的的MPII进程个个数;l 消息:分为为数据(ddataa)和包装(eenveeloppe)两两个部分分,其中中,包装装由接收收进程序序号、发送进进程序号号、消息标标号和通信器器四部分分组成,数数据包含含用户将将要传递递的内容容;l 进程组:一一类进程程的集合合,在它它的基础础上,可可以定义义新的通通信器;l 基本数据类类型:对对应于FFORTTRANN和C语语言的内内部数据据类型(IINTEEGERR,REEAL,DDOUBBLE PREECISSIONN,COOMPLLEX,LLOGIICALL,CHHARAACTEER),MMPI系系统提供供已定义义好的对对应数据据类型(MMPI_INTTEGEER,MMPI_REAAL,MMPI_DOUUBLEE_PRRECIISIOON, MPII_COOMPLLEX,MMPI_LOGGICAAL,MMPI_CHAARACCTERR);l 自定义数据据类型:基于基基本数据据类型,用用户自己己定义的的数据类类型(后后面介绍绍);l MPI对象象: MPII系统内内部定义义的数据据结构,包包括数据据类型、进进程组、通通信器等等,它们们对用户户不透明明,在FFORTTRANN语言中中,所有有MPII对象均均必须说说明为“整型变变量INNTEGGER”;l MPI联接接器(hhanddle):联接MMPI对对象和用用户的桥桥梁,用用户可以以通过它它访问和和参与相相应MPPI对象象的具体体操作;例如,MMPI系系统内部部提供的的通信器器MPII_COOMM_WORRLD;在FOORTRRAN语语言中,所所有MPPI联接接器均必必须说明明为“整型变变量INNTEGGER”;l 进程拓扑结结构:进进程组内内部进程程之间的的一种相相互连接接结构,如如3´3 网格,将将在后面面介绍。 33 ´ 33 网网格拓扑扑结构l 静态进程个个数:进进程数由由命令“mpiirunn np xxxx”初始确确定为xxxx个个,程序序执行过过程中不不能动态态改变进进程的个个数;l 消息缓存区区:应用用程序产产生的消消息包含含的数据据所处的的内存空空间;l 标准输入:所有进进程的标标准输入入reaad(*,*)均省缺缺为当前前终端屏屏幕,且且只能由由0号进进程执行行该操作作,其他他进程需需要这些些输入参参数,只只能由00号进程程执行数数据广播播操作;l 标准输出:所有进进程可以以独立执执行标准准输出wwritte(*,*),但但其省缺缺为当前前终端屏屏幕;4MPII函数格格式:l FORTAAN语言言中,最最后一个个参数为为该函数数调用是是否成功功的标志志:0表表示成功功,其它它表示各各种可能能的错误误;l C语言中,该该标志又又函数参参数返回回;C : ierrr=MMPI_Commm_rrankk(myyrannk)F : MPII_Coomm_rannk(mmyraank,ierrr)5. MMPI函函数的使使用查询询:l 由函数名查查询: mann 函数数名 ( MPII_Xxxxx), 注意意大小写写,例如如 maan MMPI_Commm_rrankk, mman MPII_Seend, maan MMPI_reccv.6. MPI函数数的学习习与使用用:l 注重MPII函数的的各类功功能,由由应用程程序的通通信需求求出发,寻寻找匹配配的函数数类型,在在查找具具体函数数名,采采用maan命令令可以查查询该函函数的具具体参数数含义和和使用方方法。l 7. 一般般的MPPI程序序设计流流程图程序参数说明Call MPI_Init ( ) 进入入MPII系统,通信器器 MPII_COOMM_WORRLD形形成Call MPI_Comm_rank ( )Call MPI_Comm_size ( )建立新的通信器、定义新的数据类型和进程拓扑结构应用程序实体:1 计算控制程序体;2 进程间通信; 退退出MPPI系统统Call MPI_Finalize ( )End四、初步的的MPII消息传传递函数数1点对点点通信(ppoinnt-tto-ppoinnt)l 定义:给定定属于同同一通信信器内的的两个进进程,其其中一个个发送消消息,一一个接收收消息;l MPI系统统定义的的所有通通信方式式均建立立在点对对点通信信之上;l 四种模式:标准模模式、缓缓存区模模式、同同步模式式、就绪绪模式;2标准模模式点对对点通信信l 进程可以随随意地发发送(接接收)消消息,与与是否存存在匹配配的消息息接收(发发送)进进程无关关;进程0进程1 发发收匹配配: 进程2进程1进程0 发发收不匹匹配:l 两类:n 阻塞式:消消息发送送函数返返回,用用户可以以对消息息缓存区区进行处处理,不不会影响响已发送送的消息息数据;接受函函数返回回,用户户可以使使用接受受到的消消息数据据;n 非阻塞式:发送和和接受函函数返回回后,必必须调用用另一类类函数来来确保它它们的正正确完成成; 阻阻塞式 非阻塞塞式 INTEGGER A IINTEEGERR AAA=1000 A=1000MPI_SSendd(A,1,.) MPPI_IIsennd(AA,1,)A=2000 A=2000 消息数据据: AA=1000 AA=1000 或或 A=2000 MMPI_Iseend(A,11,flaag,) MMPI_Waiit(fflagg,) AA=2000消息数据: A=1000 A=1100 3点对点点通信函函数举例例l 阻塞式标准准消息发发送函数数MPI_SSendd(buuf,ccounnt,ddataatyppe,ddestt,taag,ccommm,ieerr) Reaal*88(inntegger,)buf : 消息发送缓存区起始地址 (Foortrran, 用户户的待发发送的第第一个数数据) inttegeer couunt :buuf起始始的数据据单元个个数 inttegeer dattatyype :数数据类型型(基本本或用户户定义的的) inttegeer desst : 接收进进程序号号 inttegeer tagg : 消息的的标号 inttegeer commm : 通通信器 inttegeer ierrr : 函数数调用返返回错误误码real *8 a(1000,1000)integger b(60,60)c-发送送50个个双精度度数“a(55,200) : a(54,20)”到2号号进程call MPII_Seend( a (5,20),500,MPPI_DDOUBBLE_PREECISSIONN,2, & 9999999,MMPI_COMMM_WWORLLD,iierrr )c-发送送20个个整型数数“b(220,440) : bb(399,400)”到5号号进程call MPII_Seend( b (200,400),220,MMPI_DOUUBLEE_PRRECIISIOON,55, & 9999999,MMPI_COMMM_WWORLLD,iierrr )l 阻塞式标准准消息接接收函数数MPI_RRecvv(buuf,ccounnt,ddataatyppe,ddestt,taag,ccommm,sttatuus, ierrr) Reaal*88(inntegger,)buf : 消息接收缓存区起始地址 (Foortrran, 用户户用于接接受的第第一个数数据) inttegeer couunt :buuf起始始的数据据单元个个数 inttegeer dattatyype :数数据类型型(基本本或用户户定义的的) inttegeer desst : 发送进进程序号号 inttegeer tagg : 消息的的标号 inttegeer commm : 通通信器 inttegeer staatuss(MPPI_SSTATTUS_SIZZE) : 接接收状态态数组; inttegeer ierrr : 函数数调用返返回错误误码real *8 a(1000,1000)integger b(60,60)c-从22号进程程接收550个双双精度数数到“a(55,200) : a(54,20)”call MPII_Reecv( a (5,20),500,MPPI_DDOUBBLE_PREECISSIONN,2, & 9999999,MMPI_COMMM_WWORLLD,sstattus,ierrr )c-从55号进程程接收220个整整型数到到“b(220,440) : bb(399,400)”call MPII_Reecv( b (200,400),220,MMPI_DOUUBLEE_PRRECIISIOON,55, & 9999999,MMPI_COMMM_WWORLLD,sstattus,ierrr )l 其他点对点点通信函函数:参参考手册册;4聚合通通信(CColllecttivee Coommuuniccatiion)l 定义:属于于同一通通信器的的所有MMPI进进程均必必须参与与的通信信操作;l 参与方式:调用同同一聚合合通信函函数;l 函数类型:Ø 同步通信函函数:所所有进程程在某个个程序点点上同步步; MPPI_BBarrrierr ( commm , ieerr )Ø 全局通信函函数: ª 广播: MMPI_Bcaast(buff,coountt,dttypee,rooot,commm,iierrr)root 发送 othher 接受ª 收集:MPPI_GGathher(buffs,bbufrr,coountt,dttypee,rooot,commm,iierrr)all 发发送大小小一致的的数据块块 rooot接受受并按序序号连续续存放ª 全收集:MMPI_Alllgattherr()all 发发送 alll接受 ª 索引收集:MPII_Gaatheerv() alll 发发送大小小不等的的数据块块 rooot接受受并按索索引间断断存放ª 索引全收集集:MPPI_AAllggathhervv() alll 发发送大小小不等的的数据块块 Alll接受并并按索引引间断存存放ªª 分散:MPPI_SScattterr(buufs,buffr,ccounnt,ddtyppe,rroott,coomm,ierrr)root 发送连连续的大大小一致致数据块块 Alll 接受受ª 索引分散: MPPI_SScattterrv()root 发送间间断的大大小不一一致数据据块 Alll 接受受ª 全交换: MPPI_AAllttoalll() All 发发送大小小一致数数据块到到各进程程 Alll接受大大小一致致数据块块并按序序号连续续存放ª 索引全交换换: MMPI_Allltoaallvv()Ø 全局规约(glooball reeducctioon)函函数:ª 规约: MPII_Reeducce(ssbuff,rbbuf,couunt,dtyype,op,rooot, commm,iierrr);规约操作类类型opp : MPPI_SSUM, MPPI_MMIN, MPPI_MMAX, MPII_PRROD等等12种种; 例例子: 求两两个向量量的内积积,并将将结果返返回进程程0 subbrouutinne ppar_blaas1(m,aa,b,c,ccommm) reaal a(mm),bb(m) ! loccal sliice of arrray reaal c ! ressultt reaal summ inttegeer m,ccommm,i,ieerrcc !loocall suum suum=00.0dd0 doo ii=1,m ssum=summ+a(i)*bb(i) ennddooc ! gglobbal summ calll MMPI_Redducee(suum,cc,1,MPII_REEAL,MPII_SUUM,00, && ccommm,ieerr)ª 全规约: MPII_Alllreeducce(), 除除要求将将结果返返回到所所有进程程外,与与MPII_Reeducce()一致;ª 规约分散: MPPI_RReduuce_scaatteer(),将规规约结果果分散到到各进程程;ª 并行前缀计计算:MMPI_Scaan()五、作业一一 P个进进程,第第i个进程程将其包包含1000个双双精度数数据的数数组A(1100)传传送给第第(i +1)mmod P个进程程,同时时从第(i -1)mod P个进程接受100个双精度数据到另一个数组B(100)中,令数组C(1:100)=A(1:100)+B(1:100),然后求数组C(1:100)各元素的类加和,最后在将该和全部累加到0号进程,打印并输出该和。 提提示:可可在例11的基础础上修改改,编制制。六、先进的的MPII函数1自定义义数据类类型l 定义:在MMPI系系统已定定义的基基本数据据类型(MMPI_INTTEGEER,MMPI_REAAL,MMPI_DOUUBLEE_PRRECIISIOON,MMPI_CHAARACCTERR等)基基础上,用用户根据据需求,自自己定义义的数据据类型; reaal a(110000) 发送 : aa(5:9) calll MMPI_Sennd(aa(5), 55, MMPI_ REEAL,.) OK 发送 : aa(5),a(7),a(99),aa(111),aa(133),aa(155) doo i=5, 155, 22 caall MPII_Seend(a(ii),11,MPPI_RREALL,.) OOK ennddoo 缺点: 多次次发送,效效率低,程程序设计计繁琐 改进: 用户定定义新的的数据类类型 calll MPII_Tyype_vecctorr(5,1,22,MPPI_RREALL,neewtyype,ierrr) caall MPPI_TTypee_coommiit(nnewttypee , ierrr) 提提交 caall MPPI_SSendd(a(5), 1, neewtyype,.) caall MPPI_TTypee_frree(newwtyppe,iierrr) 释放l 在用户已定定义好的的数据类类型基础础上,还还可以进进一步定定义新的的数据类类型;l 用户定义的的数据类类型,必必须由函函数MPPI_TTypee_Coommiit()提交给给MPII系统;此后,就就可以象象基本数数据类型型一样,在在消息传传递函数数中重复复使用;并由函函数MPPI_TTypee_frree()释放放;l 具体自定义义数据类类型函数数,请参参考手册册;2进程拓拓扑结构构l