欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    国家973项目高性能计算环境支持讲座.doc

    • 资源ID:11353343       资源大小:160.50KB        全文页数:34页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    国家973项目高性能计算环境支持讲座.doc

    国家973项目高性能计算环境支持讲座MPI与PETSc日期内容815上午进程与消息传递、MPI应用现状、MPI并行程序设计入门、初步的MPI消息传递函数下午作业一、讨论816上午作业一讲评、先进的MPI函数、并行程序示例2、MPI的发展下午作业二、讨论817上午作业二讲评、并行可扩展科学计算工具箱PETSc介绍下午PETSc程序示例个人介绍莫则尧,男,汉族,1971年7月生,副研究员:l 1992年国防科技大学应用数学专业本科毕业;l 1997年国防科技大学计算机应用专业并行算法方向博士毕业;l 1999年北京应用物理与计算数学数学博士后流动站出站,并留所工作;l 主要从事大规模科学与工程并行计算研究。消息传递并行编程环境MPI一、 进程与消息传递二、 MPI环境的应用现状三、 MPI并行程序设计入门(程序例1)四、 初步的MPI消息传递函数五、 作业一六、 先进的MPI函数七、 MPI并行程序示例2(求解-Du=f);八、 MPI环境的发展九、 作业二一、进程与消息传递1单个进程(process)l 进程是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位;l 通俗理解:串行应用程序编译形成的可执行代码,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。进程1进程2 内存2单机内多个进程:l 多个进程可以同时存在于单机内同一操作系统:由操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等);l 进程间相互独立(内存空间不相交):在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机中运行;l 进程间可以相互交换信息:例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式;l 最基本的消息传递操作:发送消息(send)、接受消息(receive)、进程同步(barrier)、规约(reduction);l 消息传递的实现:共享内存或信号量,用户不必关心; 进程1 进程2 发送数据 接收数据 (消息传递) 内存空间3包含于通过网络联接的不同计算机的多个进程:l 进程独立存在:进程位于不同的计算机,由各自独立的操作系统调度,享有独立的CPU和内存资源;l 进程间相互信息交换:消息传递;l 消息传递的实现:基于网络socket机制,用户不必关心;4消息传递库函数:l 应用程序接口(API):提供给应用程序(FORTRAN、C、C+语言)的可直接调用的完成进程间消息传递的某项特定功能的函数;l 消息传递库:所有定义的消息传递函数编译形成的软件库,调用其内部函数的应用程序,通过与之联接,即可成为可并行执行的程序;l 目前流行的消息传递函数库:PVM 3.3.11、MPICH 1.2、LAMMPI 6.4等;5标准消息传递界面(MPI:Message Passing Interface):l MPI标准:根据应用程序对消息传递功能的需求,全球工业、应用和研究部门联合推出标准的消息传递界面函数,不考虑其具体实现,以保证并行应用程序的可移植性;l MPI的具体实现:消息传递库函数,目前有影响的为MPICH和LAMMPI,我们注重MPICH系列;6基于消息传递的并行程序执行模式:l SPMD模式:单程序多数据流并行应用程序代码 可执行代码 运行复制多份并独立执行,形成多个独立的进程 进程三(内存)进程二(内存)进程一(内存)消息传递(交换数据、同步、规约)协同l MPMD模式:多程序多数据流,除初始启动多个可执行代码,其余与SPMD模式一致;7共享存储与分布式存储:l 属于并行机体系结构的范畴,与消息传递并行程序设计平台无关; 节点CPUCPU CPUCPUCPUCPUMMM互连网络互连网络MMM 分布式存储 共享存储l 消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关,任何支持进程间通信的并行机,均可支持消息传递并行程序设计;l 几乎所有共享和分布存储并行计算环境均支持进程间的消息传递通信;二、MPI环境的应用现状l MPI(消息传递界面)是全球工业、政府和科研部门联合推出的适合进程间进行标准消息传递的并行程序设计平台,最初版MPI 1.0本于1994年6月推出,目前最新的为MPI 2.0版,于1998年年低推出;l MPI的具体实现:MPICH和LAMMPI,目前均已实现MPI 1.2版,适用于任何并行计算平台;部分并行机已实现MPI 2.0版;l MPI是目前应用最广的并行程序设计平台,几乎被所有并行计算环境(共享和分布式存储并行机、MPP、机群系统等)和流行的多进程操作系统(UNIX、Windows NT)所支持,基于它开发的应用程序具有最佳的可移植性;l 目前高效率的超大规模并行计算(1000个处理器)最可信赖的平台;l 工业、科学与工程计算部门的大量科研和工程软件(气象、石油、地震、空气动力学、核等)目前已经移植到MPI平台,发挥了重要作用;l 目前,MPI相对于PVM:Ø 优点:功能强大,性能高,适应面广,使用方便,可扩展性好;Ø 缺点:进程数不能动态改变;三、MPI并行程序设计入门1 MPI并行程序设计平台由标准消息传递函数及相关辅助函数构成,多个进程通过调用这些函数(类似调用子程序),进行通信;2 MPI程序:l SPMD执行模式:一个程序同时启动多份,形成多个独立的进程,在不同的处理机上运行,拥有独立的内存空间,进程间通信通过调用MPI函数来实现;l 每个进程开始执行时,将获得一个唯一的序号(rank)。例如启动P个进程,序号依次为0,1,P-1;l MPI程序例1:进程0发送一个整数给进程1;进程1将该数加1,传递给进程2;进程2再将该数加1,再传递给进程3;依次类推,最后,进程P-1将该数传递给进程0,由进程0负责广播该数给所有进程,并打印输出。 program example1 include “mpif.h” ! MPI系统头文件 integer status(MPI_STATUS_SIZE),my_rank,p,source,dest,tag,ierr,datacc-进入MPI系统 call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr) call MPI_Comm_size(MPI_COMM_WORLD,p,ierr)cc-数据交换 data=0 tag = 5 source= my_rank-1 if(source.eq.-1) source=p-1 dest =my_rank+1 if(dest.eq.p) dest=0 if(my_rank.eq.0) then call MPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr) call MPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr) else call MPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr) data=data+1 call MPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr) endifcc-广播数据 call MPI_Bcast(data,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)cc-打印输出 if(my_rank.eq.0) then if(data.eq.p-1) then print *,”Successful, data=”,data else print *,”Failure, data=”,data endif endifc call MPI_Finalize(ierr) endl 编译命令: mpif77 -o exam.e example.f l 运行命令: mpirun np 4 exam.e l 运行效果:MPI系统选择相同或不同的4个处理机,在每个处理机上运行程序代码exam.e。 MPI函数 进程0 进程1 进程2 进程3进入MPI系统 Init() Comm_rank() my_rank=0 myrank=1 myrank=2 my_rank=3Comm_size() p=4 p=4 p=4 p=4 tag=5,data=0 tag=5,data=0 tag=5,data=0 tag=5,data=0 source=3 source=0 source=1 source=2 dest=1 dest=2 dest=3 dest=0数据交换 send() recv() recv() recv() recv() data=data+1 空 send() 闲 data=data+1 等 send() 待 data=data+1 消息传递 send()Broadcast() send() recv() recv() recv()退出MPI系统 output “data”Finalize()3MPI重要概念l 进程序号(rank);各进程通过函数MPI_Comm_rank()获取各自的序号;l 消息号:消息的标号;l 通信器(Communicator):1)理解为一类进程的集合,且在该集合内,进程间可以相互通信;类比:邮局、电话局、国际网;2)任何MPI通信函数均必须在某个通信器内发生;3) MPI系统提供省缺的通信器MPI_COMM_WORLD,所有启动的MPI进程通过调用函数MPI_Init()包含在该通信器内;4)各进程通过函数MPI_Comm_size()获取通信器包含的(初始启动)的MPI进程个数;l 消息:分为数据(data)和包装(envelope)两个部分,其中,包装由接收进程序号、发送进程序号、消息标号和通信器四部分组成,数据包含用户将要传递的内容;l 进程组:一类进程的集合,在它的基础上,可以定义新的通信器;l 基本数据类型:对应于FORTRAN和C语言的内部数据类型(INTEGER,REAL,DOUBLE PRECISION,COMPLEX,LOGICAL,CHARACTER),MPI系统提供已定义好的对应数据类型(MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION, MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER);l 自定义数据类型:基于基本数据类型,用户自己定义的数据类型(后面介绍);l MPI对象: MPI系统内部定义的数据结构,包括数据类型、进程组、通信器等,它们对用户不透明,在FORTRAN语言中,所有MPI对象均必须说明为“整型变量INTEGER”;l MPI联接器(handle):联接MPI对象和用户的桥梁,用户可以通过它访问和参与相应MPI对象的具体操作;例如,MPI系统内部提供的通信器MPI_COMM_WORLD;在FORTRAN语言中,所有MPI联接器均必须说明为“整型变量INTEGER”;l 进程拓扑结构:进程组内部进程之间的一种相互连接结构,如3´3 网格,将在后面介绍。 3 ´ 3 网格拓扑结构l 静态进程个数:进程数由命令“mpirun np xxx”初始确定为xxx个,程序执行过程中不能动态改变进程的个数;l 消息缓存区:应用程序产生的消息包含的数据所处的内存空间;l 标准输入:所有进程的标准输入read(*,*)均省缺为当前终端屏幕,且只能由0号进程执行该操作,其他进程需要这些输入参数,只能由0号进程执行数据广播操作;l 标准输出:所有进程可以独立执行标准输出write(*,*),但其省缺为当前终端屏幕;4MPI函数格式:l FORTAN语言中,最后一个参数为该函数调用是否成功的标志:0表示成功,其它表示各种可能的错误;l C语言中,该标志又函数参数返回;C : ierr=MPI_Comm_rank(myrank)F : MPI_Comm_rank(myrank,ierr)5. MPI函数的使用查询:l 由函数名查询: man 函数名 ( MPI_Xxxx), 注意大小写,例如 man MPI_Comm_rank, man MPI_Send, man MPI_recv.6. MPI函数的学习与使用:l 注重MPI函数的各类功能,由应用程序的通信需求出发,寻找匹配的函数类型,在查找具体函数名,采用man命令可以查询该函数的具体参数含义和使用方法。l 7. 一般的MPI程序设计流程图程序参数说明Call MPI_Init ( ) 进入MPI系统,通信器 MPI_COMM_WORLD形成Call MPI_Comm_rank ( )Call MPI_Comm_size ( )建立新的通信器、定义新的数据类型和进程拓扑结构应用程序实体:1 计算控制程序体;2 进程间通信; 退出MPI系统Call MPI_Finalize ( )End四、初步的MPI消息传递函数1点对点通信(point-to-point)l 定义:给定属于同一通信器内的两个进程,其中一个发送消息,一个接收消息;l MPI系统定义的所有通信方式均建立在点对点通信之上;l 四种模式:标准模式、缓存区模式、同步模式、就绪模式;2标准模式点对点通信l 进程可以随意地发送(接收)消息,与是否存在匹配的消息接收(发送)进程无关;进程0进程1 发收匹配: 进程2进程1进程0 发收不匹配:l 两类:n 阻塞式:消息发送函数返回,用户可以对消息缓存区进行处理,不会影响已发送的消息数据;接受函数返回,用户可以使用接受到的消息数据;n 非阻塞式:发送和接受函数返回后,必须调用另一类函数来确保它们的正确完成; 阻塞式 非阻塞式 INTEGER A INTEGER AA=100 A=100MPI_Send(A,1,.) MPI_Isend(A,1,)A=200 A=200 消息数据: A=100 A=100 或 A=200 MPI_Isend(A,1,flag,) MPI_Wait(flag,) A=200消息数据: A=100 A=100 3点对点通信函数举例l 阻塞式标准消息发送函数MPI_Send(buf,count,datatype,dest,tag,comm,ierr) Real*8(integer,)buf : 消息发送缓存区起始地址 (Fortran, 用户的待发送的第一个数据) integer count :buf起始的数据单元个数 integer datatype :数据类型(基本或用户定义的) integer dest : 接收进程序号 integer tag : 消息的标号 integer comm : 通信器 integer ierr : 函数调用返回错误码real *8 a(100,100)integer b(60,60)c-发送50个双精度数“a(5,20) : a(54,20)”到2号进程call MPI_Send( a (5,20),50,MPI_DOUBLE_PRECISION,2, & 99999,MPI_COMM_WORLD,ierr )c-发送20个整型数“b(20,40) : b(39,40)”到5号进程call MPI_Send( b (20,40),20,MPI_DOUBLE_PRECISION,5, & 99999,MPI_COMM_WORLD,ierr )l 阻塞式标准消息接收函数MPI_Recv(buf,count,datatype,dest,tag,comm,status, ierr) Real*8(integer,)buf : 消息接收缓存区起始地址 (Fortran, 用户用于接受的第一个数据) integer count :buf起始的数据单元个数 integer datatype :数据类型(基本或用户定义的) integer dest : 发送进程序号 integer tag : 消息的标号 integer comm : 通信器 integer status(MPI_STATUS_SIZE) : 接收状态数组; integer ierr : 函数调用返回错误码real *8 a(100,100)integer b(60,60)c-从2号进程接收50个双精度数到“a(5,20) : a(54,20)”call MPI_Recv( a (5,20),50,MPI_DOUBLE_PRECISION,2, & 99999,MPI_COMM_WORLD,status,ierr )c-从5号进程接收20个整型数到“b(20,40) : b(39,40)”call MPI_Recv( b (20,40),20,MPI_DOUBLE_PRECISION,5, & 99999,MPI_COMM_WORLD,status,ierr )l 其他点对点通信函数:参考手册;4聚合通信(Collective Communication)l 定义:属于同一通信器的所有MPI进程均必须参与的通信操作;l 参与方式:调用同一聚合通信函数;l 函数类型:Ø 同步通信函数:所有进程在某个程序点上同步; MPI_Barrier ( comm , ierr )Ø 全局通信函数: ª 广播: MPI_Bcast(buf,count,dtype,root,comm,ierr)root 发送 other 接受ª 收集:MPI_Gather(bufs,bufr,count,dtype,root,comm,ierr)all 发送大小一致的数据块 root接受并按序号连续存放ª 全收集:MPI_Allgather()all 发送 all接受 ª 索引收集:MPI_Gatherv() all 发送大小不等的数据块 root接受并按索引间断存放ª 索引全收集:MPI_Allgatherv() all 发送大小不等的数据块 All接受并按索引间断存放ªª 分散:MPI_Scatter(bufs,bufr,count,dtype,root,comm,ierr)root 发送连续的大小一致数据块 All 接受ª 索引分散: MPI_Scatterv()root 发送间断的大小不一致数据块 All 接受ª 全交换: MPI_Alltoall() All 发送大小一致数据块到各进程 All接受大小一致数据块并按序号连续存放ª 索引全交换: MPI_Alltoallv()Ø 全局规约(global reduction)函数:ª 规约: MPI_Reduce(sbuf,rbuf,count,dtype,op,root, comm,ierr);规约操作类型op : MPI_SUM, MPI_MIN, MPI_MAX, MPI_PROD等12种; 例子: 求两个向量的内积,并将结果返回进程0 subroutine par_blas1(m,a,b,c,comm) real a(m),b(m) ! local slice of array real c ! result real sum integer m,comm,i,ierrcc !local sum sum=0.0d0 do i=1,m sum=sum+a(i)*b(i) enddoc ! global sum call MPI_Reduce(sum,c,1,MPI_REAL,MPI_SUM,0, & comm,ierr)ª 全规约: MPI_Allreduce(), 除要求将结果返回到所有进程外,与MPI_Reduce()一致;ª 规约分散: MPI_Reduce_scatter(),将规约结果分散到各进程;ª 并行前缀计算:MPI_Scan()五、作业一 P个进程,第i个进程将其包含100个双精度数据的数组A(100)传送给第(i +1)mod P个进程,同时从第(i -1)mod P个进程接受100个双精度数据到另一个数组B(100)中,令数组C(1:100)=A(1:100)+B(1:100),然后求数组C(1:100)各元素的类加和,最后在将该和全部累加到0号进程,打印并输出该和。 提示:可在例1的基础上修改,编制。六、先进的MPI函数1自定义数据类型l 定义:在MPI系统已定义的基本数据类型(MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_CHARACTER等)基础上,用户根据需求,自己定义的数据类型; real a(1000) 发送 : a(5:9) call MPI_Send(a(5), 5, MPI_ REAL,.) OK 发送 : a(5),a(7),a(9),a(11),a(13),a(15) do i=5, 15, 2 call MPI_Send(a(i),1,MPI_REAL,.) OK enddo 缺点: 多次发送,效率低,程序设计繁琐 改进: 用户定义新的数据类型 call MPI_Type_vector(5,1,2,MPI_REAL,newtype,ierr) call MPI_Type_commit(newtype , ierr) 提交 call MPI_Send(a(5), 1, newtype,.) call MPI_Type_free(newtype,ierr) 释放l 在用户已定义好的数据类型基础上,还可以进一步定义新的数据类型;l 用户定义的数据类型,必须由函数MPI_Type_Commit()提交给MPI系统;此后,就可以象基本数据类型一样,在消息传递函数中重复使用;并由函数MPI_Type_free()释放;l 具体自定义数据类型函数,请参考手册;2进程拓扑结构l 定义:根据应用程序的特征,在进程间建立的一种虚拟拓扑连接方式,以方便并行程序设计和提高并行计算性能;l 例:二维规则区域,3*3 区域分解,9个进程,建立Cartesion坐标,进程(i,j)的相邻进程为 (i-1,j), (i+1,j), (i,j-1), (i,j+1);2(0,2)1(0,1)0(0,0)2105(1,2)4(1,1)3(1,0)4358762(2,2)0(2,0)1(2,1)3并行I/Ol 各进程可以类似于串行程序独立地读/写不同的文件;l MPICH 1.2以上版本支持所有进程并行读写同一个文件;七、MPI并行程序示例21 一维Dirichlet问题:- D u (x) = f(x) x Î W =(0,1)u(0)=0.0, u(1)=0.0, f(x)=4.0 算法: 均匀网格有限差分离散,Jacobi迭代求解。 区域分解:nproc=4, n = 21, ns = (n-1)/nproc+1 =6 0 1 2 3 0 0.5 1 program example implicit real*8 (a-h,o-z) include “mpif.h” parameter ( n = 21, nproc = 4, ns = (n-1)/nproc+1) parameter ( errtol=1.e-4,nitmax=100) dimension u(ns), f(ns), solution(ns),uold(0:ns) ! u(0) : left dummy grid point ! u(ns+1) : right dummy grid point integer status(MPI_STATUS_SIZE),sizecc enter into MPI call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD,myrank,ierr) call MPI_Comm_size(MPI_COMM_WORLD,size,ierr) if(size.ne.nproc) then print *,”+ errors for number of process distributions +” goto 888 endifcc assign initial values h = 1.0d0/(n-1) ! discrete step size xst = myrank*(ns-1)*h ! start x-coordinate of local domain nlocal=ns-1 ! local number of grid point ist=1 if(myrank.eq.0) ist=ist+1 do i=1,ns f(i)=4.0d0 u(i)=0.0d0 uold(i)=0.0d0 xauxi=xst+(i-1)*h solution(i)= -2*xauxi*(xauxi-1.0d0) enddo u(0)=0.0d0c nlp=myrank-1 ! left process nrp=myrank+1 ! right process if(nlp.lt.0) nlp=MPI_PROC_NULL if(nrp.gt.nproc-1) nrp=MPI_PROC_NULL ! null process, null communication operationcc Jacobi iterating nit =0 ! current iterationsc10 continuec swapping dummy elements along pseudo-boundary call MPI_Send(uold(1),1,MPI_DOUBLE_PRECISION, & nlp,nit, MPI_COMM_WORLD,ierr) call MPI_Send(uold(nlocal),1, MPI_DOUBLE_PRECISION, & nrp,nit,MPI_COMM_WORLD,ierr) call MPI_Recv(uold(nlocal+1),1,MPI_DOUBLE_PRECISION, & nrp,nit, MPI_COMM_WORLD,status,ierr) call MPI_Recv(uold(0),1, MPI_DOUBLE_PRECISION, & nlp,nit, MPI_COMM_WORLD,status, ierr)c iterating and convergenc checking error=0.0d0 do i=ist,nlocal u(i)=(h*h*f(i)+uold(i-1)+uold(i+1)/2 xauxi= dabs(u(i)-solution(i) if(dabs(xauxi).gt.error) error=xauxi enddocc maximum error call MPI_Allreduce(error,xauxi,1,MPI_DOUBLE_PRECISION,MPI_MAX, & MPI_COMM_WORLD,ierr) error=xauxi

    注意事项

    本文(国家973项目高性能计算环境支持讲座.doc)为本站会员(创****公)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开