PDF文库 - 千万精品文档,你想要的都能搜到,下载即用。

消息传递并行编程环境MPI.pdf

哥特式、悲伤34 页 80.438 KB下载文档
消息传递并行编程环境MPI.pdf消息传递并行编程环境MPI.pdf消息传递并行编程环境MPI.pdf消息传递并行编程环境MPI.pdf消息传递并行编程环境MPI.pdf消息传递并行编程环境MPI.pdf
当前文档共34页 2.88
下载后继续阅读

消息传递并行编程环境MPI.pdf

国家 973 项目高性能计算环境支持讲座 MPI 与 PETSc 莫则尧 (北京应用物理与计算数学研究所) 日期 8.15 8.16 8.17 内容 上 午 进程与消息传递、 MPI 应用现状、 MPI 并行程序设计入门、 初步的 MPI 消息传递函数 下 午 作业一、讨论 上 午 作业一讲评、 先进的 MPI 函数、 并行程序示例 2、 MPI 的发展 下 午 上 午 下 午 作业二、讨论 作业二讲评、 并行可扩展科学计算工具箱 PETSc 介绍 PETSc 程序示例 1 个人介绍 莫则尧,男,汉族,1971 年 7 月生,副研究员: l 1992 年国防科技大学应用数学专业本科毕业; l 1997 年国防科技大学计算机应用专业并行算法 方向博士毕业; l 1999 年北京应用物理与计算数学数学博士后流 动站出站,并留所工作; l 主要从事大规模科学与工程并行计算研究。 2 消息传递并行编程环境 MPI 一、 进程与消息传递 二、 MPI 环境的应用现状 三、 MPI 并行程序设计入门(程序例 1) 四、 初步的 MPI 消息传递函数 五、 作业一 六、 先进的 MPI 函数 七、 MPI 并行程序示例 2(求解-∆u=f); 八、 MPI 环境的发展 九、 作业二 3 一、进程与消息传递 1.单个进程(process) l 进程是一个程序,同时包含它的执行环境(内存、寄 存器、程序计数器等),是操作系统中独立存在的可 执行的基本程序单位; l 通俗理解:串行应用程序编译形成的可执行代码,分 为“指令”和“数据”两个部分,并在程序执行时“独 立地申请和占有”内存空间,且所有计算均局限于该 内存空间。 进程 1 进程 2 内存 2.单机内多个进程: l 多个进程可以同时存在于单机内同一操作系统:由操 作系统负责调度分时共享处理机资源(CPU、内存、 存储、外设等) ; l 进程间相互独立(内存空间不相交):在操作系统调 度下各自独立地运行,例如多个串行应用程序在同一 台计算机中运行; l 进程间可以相互交换信息:例如数据交换、同步等待, 消息是这些交换信息的基本单位,消息传递是指这 4 些信息在进程间的相互交换,是实现进程间通信的唯 一方式; l 最基本的消息传递操作:发送消息(send)、接受消 息(receive)、进程同步( barrier)、规约(reduction); l 消息传递的实现:共享内存或信号量,用户不必关心; 进程 1 进程 2 发送数据 接收数据 (消息传递) 内存空间 3.包含于通过网络联接的不同计算机的多个进程: l 进程独立存在:进程位于不同的计算机,由各自独立 的操作系统调度,享有独立的 CPU 和内存资源; l 进程间相互信息交换:消息传递; l 消息传递的实现:基于网络 socket 机制,用户不必关 心; 4.消息传递库函数: l 应用程序接口(API) :提供给应用程序( FORTRAN、 C、C++语言)的可直接调用的完成进程间消息传递 5 的某项特定功能的函数; 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 6.基于消息传递的并行程序执行模式: l SPMD 模式:单程序多数据流 并行应用程序代码 可执行代码 运行 复制多份并独立执行,形 成多个独立的进程 进程三︵内存︶ 进程二︵内存︶ 进程一︵内存︶ 消息传递(交换数据、同步、规约)协同 l MPMD 模式:多程序多数据流,除初始启动多个可 执行代码,其余与 SPMD 模式一致; 7.共享存储与分布式存储: l 属于并行机体系结构的范畴,与消息传递并行程序设 计平台无关; 7 节点 CPU CPU CPU M M M CPU CPU 互连网络 CPU 互连网络 M 分布式存储 M M 共享存储 l 消息传递是相对于进程间通信方式而言的,与具体并 行机存储模式无关,任何支持进程间通信的并行机, 均可支持消息传递并行程序设计; l 几乎所有共享和分布存储并行计算环境均支持进程 间的消息传递通信; 8 二、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: Ø 优点:功能强大,性能高,适应面广,使用方便,可 扩展性好; 9 Ø 缺点:进程数不能动态改变; 10 三、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 负责广播该数给所有进程, 并打印输出。 11 program include example1 “mpif.h” integer status(MPI_STATUS_SIZE),my_rank,p,source,dest,tag,ierr,data !! MPI 系统头文件 c c-------进入 MPI 系统 call MPI_Init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr) call MPI_Comm_size(MPI_COMM_WORLD,p,ierr) c c-------数据交换 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) endif c c-------广播数据 call MPI_Bcast(data,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) c c------打印输出 if(my_rank.eq.0) then if(data.eq.p-1) then print *,”Successful, data=”,data else print *,”Failure, data=”,data endif endif c call MPI_Finalize(ierr) end 12 l 编译命令: mpif77 -o exam.e l 运行命令: mpirun –np 4 example.f exam.e l 运行效果:MPI 系统选择相同或不同的 4 个处理机, 在每个处理机上运行程序代码 exam.e。 MPI 函数 进程 0 进程 1 Init() 进程 2 进程 3 进入 MPI 系统 Comm_rank() my_rank=0 myrank=1 myrank=2 my_rank=3 Comm_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 消息传递 Broadcast() send() recv() send() recv() output “data” Finalize() 退出 MPI 系统 13 recv() 3.MPI 重要概念 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); 14 , 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 消息缓存区:应用程序产生的消息包含的数据所处的内 15 存空间; l 标准输入:所有进程的标准输入 read(*,*)均省缺为当前终 端屏幕,且只能由 0 号进程执行该操作,其他进程需要 这些输入参数,只能由 0 号进程执行数据广播操作; l 标准输出:所有进程可以独立执行标准输出 write(*,*), 但其省缺为当前终端屏幕; 4.MPI 函数格式: l FORTAN 语言中,最后一个参数为该函数调用是否成 功的标志:0 表示成功,其它表示各种可能的错误; l C 语言中,该标志又函数参数返回; C : ierr=MPI_Comm_rank(myrank) F 5. : MPI_Comm_rank(myrank,ierr) MPI 函数的使用查询: l 由函数名查询: man 函数名 ( MPI_Xxxx), 注意大小写, 例如 man MPI_Comm_rank, man MPI_Send, man MPI_recv. 6. MPI 函数的学习与使用: l 注重 MPI 函数的各类功能,由应用程序的通信需求出发,寻 找匹配的函数类型,在查找具体函数名,采用 man 命令可以 查询该函数的具体参数含义和使用方法。 16 l 7. 一般的 MPI 程序设计流程图 程序参数说明 进入 MPI 系统,通信器 Call MPI_Init ( ) MPI_COMM_WORLD 形成 Call MPI_Comm_rank ( ) Call MPI_Comm_size ( ) 建立新的通信器、定义新的数据 类型和进程拓扑结构 应用程序实体: 1.计算控制程序体; 2.进程间通信; 退出 MPI 系统 Call MPI_Finalize ( ) End 17 四、初步的 MPI 消息传递函数 1.点对点通信(point-to-point) l 定义:给定属于同一通信器内的两个进程,其中一个 发送消息,一个接收消息; l MPI 系统定义的所有通信方式均建立在点对点通信 之上; l 四种模式:标准模式 、缓存区模式、同步模式、就 绪模式; 2.标准模式点对点通信 l 进程可以随意地发送(接收)消息,与是否存在匹配 的消息接收(发送)进程无关; 发收匹配: 进程 进程 1 发收不匹配: 进程 0 进程 1 进程 2 l 两类: n 阻塞式 :消息发送函数返回,用户可以对消息缓 存区进行处理,不会影响已发送的消息数据;接 受函数返回,用户可以使用接受到的消息数据; n 非阻塞式:发送和接受函数返回后,必须调用另 一类函数来确保它们的正确完成; 18 阻塞式 INTEGER 消息数据: 非阻塞式 A INTEGER A A=100 A=100 MPI_Send(A,1,… .) MPI_Isend(A,1,… ) A=200 A=200 A=100 或 A=200 A=100 MPI_Isend(A,1,… flag,… ) MPI_Wait(flag,… ) A=200 消息数据: A=100 A=100 19 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 ) 20 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 其他点对点通信函数:参考手册; 21 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 接受并按索引间断存放 22 ª 索引全收集: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_PROD 等 12 种; 23 MPI_SUM, MPI_MIN, MPI_MAX, 例子: 求两个向量的内积,并将结果返回进程 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,ierr c c !local sum sum=0.0d0 do i=1,m sum=sum+a(i)*b(i) enddo c ! global sum call MPI_Reduce(sum,c,1,MPI_REAL,MPI_SUM,0, & comm,ierr) ª 全规约: MPI_Allreduce(), 除要求将结果返回 到所有进程外,与 MPI_Reduce()一致; ª 规约分散: MPI_Reduce_scatter(),将规约结果 分散到各进程; ª 并行前缀计算:MPI_Scan() 24 五、作业一 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 的基础上修改,编制。 25 六、先进的 MPI 函数 1.自定义数据类型 l 定 义 : 在 MPI 系 统 已 定 义 的 基 本 数 据 类 型 (MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECI SION,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 用 户 定 义 的 数 据 类 型 , 必 须 由 函 数 26 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); 0 1 2 3 4 5 6 7 8 0 (0,0) 1 (0,1) 2 (0,2) 3 (1,0) 4 (1,1) 5 (1,2) 0 (2,0) 1 (2,1) 2 (2,2) 3.并行 I/O l 各进程可以类似于串行程序独立地读 /写不同 的文 件; l MPICH 1.2 以上版本支持所有进程并行读写同一个 文件; 27 七、MPI 并行程序示例 2 1.一维 Dirichlet 问题: - ∆ u (x) = f(x) x ∈ Ω =(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 0 3 0.5 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),size c c c c 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 endif assign initial values h = 1.0d0/(n-1) xst = myrank*(ns-1)*h nlocal=ns-1 ! discrete step size ! start x-coordinate of local domain ! local number of grid point 28 1 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.0d0 c 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 operation c c Jacobi iterating nit =0 ! current iterations c 10 c c c c continue 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) 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 enddo maximum error call MPI_Allreduce(error,xauxi,1,MPI_DOUBLE_PRECISION,MPI_MAX, & MPI_COMM_WORLD,ierr) error=xauxi if(error.gt.errtol) then do i=ist,nlocal 29 uold(i)=u(i) enddo if(nit.lt.nitmax) then nit=nit+1 if(myrank.eq.0) print *,"nit=",nit," error=",error goto 10 endif endif c if(myrank.eq.0) then if(nit.le.nitmax.and.error.le.errtol) then write(*,100) nit 100 format(1x, “Successfully touch the exact solution after nit = ”, & i4, “ iterations”) else write(*,200) nit 200 format(1x, “Fail to touch the exact solution after nit = ”, & i4, “ iterations”) endif endif c 888 call MPI_Finalize(ierr) c end 1. 编译 LINUX : mpif77 –o exam.e mpirun -np 4 exam.e 2.运行 30 example.f 八、MPI 环境的发展 1.版本更新: l V 1.0 V1.2 :已完成,增加了并行 I/O 功能; l V1.2 V2.0 :正进行,将增加进程数动态可调、进程间 内存数据直接访问、多个独立的并行应用程序之间的动态互 操作性等 3 项主要功能; 2.相容共享存储并行程序设计标准 OpenMP : l 在共享存储并行机上,进程与线程相容; 进程 0 进程 1 进程 3 线程 线程 线程 线程 线程 线程 0 1 0 1 0 1 l MPI 与 OpenMP 的混合编程模式: Ø 可能比较适合“SMP 机群系统”+ 物理上分区计算的应用 问题:即 SMP 之间用 MPI 处理各物理区,SMP 内部用 OpenMP 并行物理区内部的计算,综合 MPI 的可扩展性与 OpenMP 的简单性,以较小的代价获取可接受的性能; Ø 可能要求用户成为 MPI 和 OpenMP 两个方面的专家; 31 3.特定领域建立“并行应用程序开发支持框架(工具箱)”: 并行应用程序开发 难度大 消息传递繁琐,易错 并行应用程序开发框架 库软件开发和利用率低 MPI 环境 OS 通信原语 l 采用面向对象技术,围绕矩阵向量(数组)数据结构: Ø 屏蔽消息传递,用户只需调用一个函数即可完成; Ø 集成各类核心库软件,但又提供面向对象的简单、统 一的用户界面; Ø 对特定领域的具有公用性的问题,研究成熟后,可形 成高性能的特殊功能部件,集成到该框架中; Ø 高性能细节对用户屏蔽,由专家负责; Ø 用户只需集中于基于区域分解的并行计算方法设计, 然后通过调用框架提供的功能部件来完成并行应用程 序的开发,框架能保证该并行应用程序的高性能、可 扩展; 32 Ø 强调软件的可重用性、可继承性、可维护性和可验证 性,缩短应用程序开发周期; l 美国能源部 NERSC ODE2000 工程从 90 年代中期开始,重 点支持了各个领域的约 20 个该类科学计算工具箱的建立, 目前比较成功的为 Argonal 国家重点实验室开发的 PETSc (Parallel Extensible Tooltiks for Scientific Computing),由于 在 LLNL 的三维无结构网格 NS 应用程序的成功应用 (ASCI Red 3072 台处理机,95%的并行效率,25%的峰值浮点 性能),获得 SC’99 Gondar Bell 最佳应用成就奖。(公开初 步的源代码, 但高性能的核心部件不提供) l 与 MPI 系统兼容; 33 九、作业二 (任意选择其中之一) 1.矩阵乘:C(M,L)=A(M,N)*B(N,L) 数据分割: l 矩阵 A,C : 按行等分块存储于各进程中; l 矩阵 B : 按列等分块存储于各进程中; 算法: l 初始矩阵形成:各进程独立并行地对它所拥有的矩 阵块元素按某种规律赋值; l 矩阵 B 的各子块在各进程中间循环移动,并完成 相应的矩阵子块乘操作; l 结果:矩阵 C 按行存储在各进程中,并与预期正 确结果比较,结果正确,赋标志为 0,否则为 1, 并将这些标志规约到 0 号进程,由 0 号进程打印输 出矩阵乘是否成功完成的信息。 2.求解二维规则区域上 Dirichlet 问题- ∆ u = f,有限差分离 散,沿两个方向的等网格区域分解,Jacobi 迭代求解。 34

相关文章