国家973项目高性能计算环境支持讲座
MPI与PETSc
莫则尧
(北京应用物理与计算数学研究所)
日期
进程与消息传递、
MPI应用现状、 上午
MPI并行程序
入门、 8(15
初步的MPI消息传递函数 下午 作业一、讨论
作业一讲评、
先进的MPI函数、 上午
并行程序示例2、 8(16
MPI的发展 下午 作业二、讨论
作业二讲评、 上午
并行可扩展科学计算工具箱PETSc介绍 8(17
下午 PETSc程序示例
1
个人介绍
莫则尧,男,汉族,1971年7月生,副研究员: , 1992年国防科技大学应用数学专业本科毕业; , 1997年国防科技大学计算机应用专业并行算法
方向博士毕业;
, 1999年北京应用物理与计算数学数学博士后流
动站出站,并留所工作;
, 主要从事大规模科学与工程并行计算研究。
2
消息传递并行编程环境MPI
一、 进程与消息传递
二、 MPI环境的应用现状
三、 MPI并行程序设计入门(程序例1) 四、 初步的MPI消息传递函数
五、 作业一
六、 先进的MPI函数
七、 MPI并行程序示例2(求解-,u=f); 八、 MPI环境的发展
九、 作业二
3
一、进程与消息传递
1(单个进程(process)
, 进程是一个程序,同时包含它的执行环境(内存、寄
存器、程序计数器等),是操作系统中独立存在的可
执行的基本程序单位;
, 通俗理解:串行应用程序编译形成的可执行代码,分
为“指令”和“数据”两个部分,并在程序执行时“独
立地申请和占有”内存空间,且所有计算均局限于该
内存空间。
进程1 进程2
内存
2(单机内多个进程:
, 多个进程可以同时存在于单机内同一操作系统:由操
作系统负责调度分时共享处理机资源(CPU、内存、
存储、外设等);
, 进程间相互独立(内存空间不相交):在操作系统调
度下各自独立地运行,例如多个串行应用程序在同一
台计算机中运行;
, 进程间可以相互交换信息:例如数据交换、同步等待,
消息是这些交换信息的基本单位,消息传递是指这
4
些信息在进程间的相互交换,是实现进程间通信的唯
一方式;
, 最基本的消息传递操作:发送消息(send)、接受消
息(receive)、进程同步(barrier)、规约(reduction);
, 消息传递的实现:共享内存或信号量,用户不必关心;
进程1 进程2
发送数据 接收数据
(消息传递)
内存空间
3(包含于通过网络联接的不同计算机的多个进程:
, 进程独立存在:进程位于不同的计算机,由各自独立
的操作系统调度,享有独立的CPU和内存资源;
, 进程间相互信息交换:消息传递;
, 消息传递的实现:基于网络socket机制,用户不必关
心;
4(消息传递库函数:
, 应用程序接口(API):提供给应用程序(FORTRAN、
C、C++语言)的可直接调用的完成进程间消息传递
5
的某项特定功能的函数;
, 消息传递库:所有定义的消息传递函数编译形成的软
件库,调用其内部函数的应用程序,通过与之联接,
即可成为可并行执行的程序;
, 目前流行的消息传递函数库:PVM 3.3.11、MPICH
1.2、LAMMPI 6.4等;
5(标准消息传递界面(MPI:Message Passing Interface): , MPI标准:根据应用程序对消息传递功能的需求,
全球工业、应用和研究部门联合推出标准的消息传递
界面函数,不考虑其具体实现,以保证并行应用程序
的可移植性;
, MPI的具体实现:消息传递库函数,目前有影响的
为MPICH和LAMMPI,我们注重MPICH系列;
6
6(基于消息传递的并行程序执行模式:
, SPMD模式:单程序多数据流
可执行代码 并行应用程序代码
运行
复制多份并独立执行,形
成多个独立的进程
进进进
程程程
一二三 )))
内内内 存存存
)))
消息传递(交换数据、同步、规约)协同
, MPMD模式:多程序多数据流,除初始启动多个可
执行代码,其余与SPMD模式一致;
7(共享存储与分布式存储:
, 属于并行机体系结构的范畴,与消息传递并行程序设
计平台无关;
7
节点
CPU CPU CPU CPU CPU CPU
M M M
互连网络 互连网络
M M M
分布式存储 共享存储
, 消息传递是相对于进程间通信方式而言的,与具体并
行机存储模式无关,任何支持进程间通信的并行机,
均可支持消息传递并行程序设计;
, 几乎所有共享和分布存储并行计算环境均支持进程
间的消息传递通信;
8
二、MPI环境的应用现状
, MPI(消息传递界面)是全球工业、政府和科研部门联
合推出的适合进程间进行标准消息传递的并行程序设
计平台,最初版MPI 1.0本于1994年6月推出,目前
最新的为MPI 2.0版,于1998年年低推出; , MPI的具体实现:MPICH和LAMMPI,目前均已实现
MPI 1.2版,适用于任何并行计算平台;部分并行机已
实现MPI 2.0版;
, MPI是目前应用最广的并行程序设计平台,几乎被所有
并行计算环境(共享和分布式存储并行机、MPP、机群
系统等)和流行的多进程操作系统(UNIX、Windows
NT)所支持,基于它开发的应用程序具有最佳的可移
植性;
, 目前高效率的超大规模并行计算(1000个处理器)最
可信赖的平台;
, 工业、科学与工程计算部门的大量科研和工程软件(气
象、石油、地震、空气动力学、核等)目前已经移植到
MPI平台,发挥了重要作用;
, 目前,MPI相对于PVM:
, 优点:功能强大,性能高,适应面广,使用方便,可
扩展性好;
9
, 缺点:进程数不能动态改变;
10
三、MPI并行程序设计入门
1( MPI并行程序设计平台由标准消息传递函数及相关辅助函数构成,多个进程通过调用这些函数(类似调用子程序),进行通信;
2( MPI程序:
, SPMD执行模式:一个程序同时启动多份,形成多个
独立的进程,在不同的处理机上运行,拥有独立的内
存空间,进程间通信通过调用MPI函数来实现;
, 每个进程开始执行时,将获得一个唯一的序号
(rank)。例如启动P个进程,序号依次为0,1,…,
P-1;
, MPI程序例1:进程0发送一个整数给进程1;进程
1将该数加1,传递给进程2;进程2再将该数加1,
再传递给进程3;依次类推,最后,进程P-1将该数
传递给进程0,由进程0负责广播该数给所有进程,
并打印输出。
11
program example1
include “mpif.h” !! MPI系统头文件
integer status(MPI_STATUS_SIZE),my_rank,p,source,dest,tag,ierr,data
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
, 编译命令: mpif77 -o exam.e example.f
, 运行命令: mpirun –np 4 exam.e
, 运行效果:MPI系统选择相同或不同的4个处理机,
在每个处理机上运行程序代码exam.e。
MPI函数 进程0 进程1 进程2 进程3
Init()
进入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
消息传递 send()
Broadcast() send() recv() recv() recv()
output “data”
Finalize()
退出MPI系统
13
3(MPI重要概念
, 进程序号(rank);各进程通过函数MPI_Comm_rank()获取各
自的序号;
, 消息号:消息的标号;
, 通信器(Communicator):1)理解为一类进程的集合,且在该集
合内,进程间可以相互通信;类比:邮局、电话局、国际网;
2)任何MPI通信函数均必须在某个通信器内发生;3) MPI系
统提供省缺的通信器MPI_COMM_WORLD,所有启动的MPI
进程通过调用函数MPI_Init()包含在该通信器内;4)各进程通
过函数MPI_Comm_size()获取通信器包含的(初始启动)的
MPI进程个数;
, 消息:分为数据(data)和包装(envelope)两个部分,其中,
包装由接收进程序号、发送进程序号、消息标号和通信器四
部分组成,数据包含用户将要传递的内容;
, 进程组:一类进程的集合,在它的基础上,可以定义新的通
信器;
, 基本数据类型:对应于FORTRAN和C语言的内部数据类型
(INTEGER,REAL,DOUBLE PRECISION,COMPLEX,
LOGICAL,CHARACTER),MPI系统提供已定义好的对应
数据类型(MPI_INTEGER,MPI_REAL,
MPI_DOUBLE_PRECISION, MPI_COMPLEX,
MPI_LOGICAL,MPI_CHARACTER);
14
, 自定义数据类型:基于基本数据类型,用户自己定义的数据
类型(后面介绍);
, MPI对象: MPI系统内部定义的数据结构,包括数据类
型、进程组、通信器等,它们对用户不透明,在FORTRAN
语言中,所有MPI对象均必须说明为“整型变量
INTEGER”;
, MPI联接器(handle):联接MPI对象和用户的桥梁,用
户可以通过它访问和参与相应MPI对象的具体操作;例
如,MPI系统内部提供的通信器MPI_COMM_WORLD;
在FORTRAN语言中,所有MPI联接器均必须说明为“整
型变量INTEGER”;
, 进程拓扑结构:进程组内部进程之间的一种相互连接结
构,如33 网格,将在后面介绍。
3 3 网格拓扑结构
, 静态进程个数:进程数由命令“mpirun –np xxx”初始
确定为xxx个,程序执行过程中不能动态改变进程的个
数;
, 消息缓存区:应用程序产生的消息包含的数据所处的内
15
存空间;
, 标准输入:所有进程的标准输入read(*,*)均省缺为当前终
端屏幕,且只能由0号进程执行该操作,其他进程需要
这些输入参数,只能由0号进程执行数据广播操作;
, 标准输出:所有进程可以独立执行标准输出write(*,*),
但其省缺为当前终端屏幕;
4(MPI函数格式:
, FORTAN语言中,最后一个参数为该函数调用是否成
功的标志:0表示成功,其它表示各种可能的错误;
, C语言中,该标志又函数参数返回;
C : ierr=MPI_Comm_rank(myrank)
F : MPI_Comm_rank(myrank,ierr)
5. MPI函数的使用查询:
, 由函数名查询: man 函数名 ( MPI_Xxxx), 注意大小写,
例如 man MPI_Comm_rank, man MPI_Send, man MPI_recv.
6. MPI函数的学习与使用:
, 注重MPI函数的各类功能,由应用程序的通信需求出发,寻
找匹配的函数类型,在查找具体函数名,采用man命令可以
查询该函数的具体参数含义和使用
。
16
, 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)
, 定义:给定属于同一通信器内的两个进程,其中一个
发送消息,一个接收消息;
, MPI系统定义的所有通信方式均建立在点对点通信
之上;
, 四种模式:标准模式、缓存区模式、同步模式、就
绪模式;
2(标准模式点对点通信
, 进程可以随意地发送(接收)消息,与是否存在匹配
的消息接收(发送)进程无关;
发收匹配: 进程进程1
0
发收不匹配: 0进程进程0 进程1 进程2
, 两类:
, 阻塞式:消息发送函数返回,用户可以对消息缓
存区进行处理,不会影响已发送的消息数据;接
受函数返回,用户可以使用接受到的消息数据;
, 非阻塞式:发送和接受函数返回后,必须调用另
一类函数来确保它们的正确完成;
18
阻塞式 非阻塞式
INTEGER A INTEGER A
A=100 A=100
MPI_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
19
3(点对点通信函数举例
, 阻塞式标准消息发送函数
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
, 阻塞式标准消息接收函数
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 )
, 其他点对点通信函数:参考手册;
21
4(聚合通信(Collective Communication)
, 定义:属于同一通信器的所有MPI进程均必须参与
的通信操作;
, 参与方式:调用同一聚合通信函数;
, 函数类型:
, 同步通信函数:所有进程在某个程序点上同步;
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_SUM, MPI_MIN, MPI_MAX,
MPI_PROD等12种;
23
例子: 求两个向量的内积,并将结果返回进程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(自定义数据类型
, 定义:在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) 释放
, 在用户已定义好的数据类型基础上,还可以进一步定
义新的数据类型;
, 用户定义的数据类型,必须由函数
26
MPI_Type_Commit()提交给MPI系统;此后,就可以
象基本数据类型一样,在消息传递函数中重复使用;
并由函数MPI_Type_free()释放;
, 具体自定义数据类型函数,请参考手册;
2(进程拓扑结构
, 定义:根据应用程序的特征,在进程间建立的一种虚
拟拓扑连接方式,以方便并行程序设计和提高并行计
算性能;
, 例:二维规则区域,3*3 区域分解,9个进程,建立
Cartesion坐标,进程(i,j)的相邻进程为 (i-1,j),
(i+1,j), (i,j-1), (i,j+1);
0 1 2 0 1 2 (0,0) (0,1) (0,2)
3 4 5 3 4 5
6 7 8 (1,0) (1,1) (1,2)
0 1 2
(2,0) (2,1) (2,2)
3(并行I/O
, 各进程可以类似于串行程序独立地读/写不同的文
件;
, 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 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),size
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
c
c 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
28
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 continue
c 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
enddo
c
c 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 example.f
2( 运行
mpirun -np 4 exam.e
30
八、MPI环境的发展
1( 版本更新:
, V 1.0 V1.2 :已完成,增加了并行I/O功能;
, V1.2 V2.0 :正进行,将增加进程数动态可调、进程间
内存数据直接访问、多个独立的并行应用程序之间的动态互
操作性等3项主要功能;
2(相容共享存储并行程序设计标准OpenMP :
, 在共享存储并行机上,进程与线程相容;
进程0 进程1 进程3
线线线线线线
程程程程程程0 1 0 1 0 1
, MPI与OpenMP的混合编程模式:
, 可能比较适合“SMP机群系统”+ 物理上分区计算的应用
问题:即SMP之间用MPI处理各物理区,SMP内部用
OpenMP并行物理区内部的计算,综合MPI的可扩展性与
OpenMP的简单性,以较小的代价获取可接受的性能;
, 可能要求用户成为MPI和OpenMP两个方面的专家;
31
3(特定领域建立“并行应用程序开发支持框架(工具箱)”:
并行应用程序开发
难度大
消息传递繁琐,易错 并行应用程序开发框架
库软件开发和利用率低
MPI环境
OS通信原语
, 采用面向对象技术,围绕矩阵向量(数组)数据结构:
, 屏蔽消息传递,用户只需调用一个函数即可完成;
, 集成各类核心库软件,但又提供面向对象的简单、统
一的用户界面;
, 对特定领域的具有公用性的问题,研究成熟后,可形
成高性能的特殊功能部件,集成到该框架中;
, 高性能细节对用户屏蔽,由专家负责;
, 用户只需集中于基于区域分解的并行计算方法设计,
然后通过调用框架提供的功能部件来完成并行应用程
序的开发,框架能保证该并行应用程序的高性能、可
扩展;
32
, 强调软件的可重用性、可继承性、可维护性和可验证
性,缩短应用程序开发周期;
, 美国能源部NERSC ODE2000工程从90年代中期开始,重
点支持了各个领域的约20个该类科学计算工具箱的建立,
目前比较成功的为Argonal国家重点实验室开发的PETSc
(Parallel Extensible Tooltiks for Scientific Computing),由于
在LLNL的三维无结构网格NS应用程序的成功应用(ASCI
Red 3072 台处理机,95%的并行效率,25%的峰值浮点
性能),获得SC’99 Gondar Bell 最佳应用成就奖。(公开初
步的源代码, 但高性能的核心部件不提供)
, 与MPI系统兼容;
33
九、作业二
(任意选择其中之一)
1(矩阵乘:C(M,L)=A(M,N)*B(N,L)
数据分割:
, 矩阵A,C : 按行等分块存储于各进程中;
, 矩阵B : 按列等分块存储于各进程中;
算法:
, 初始矩阵形成:各进程独立并行地对它所拥有的矩
阵块元素按某种规律赋值;
, 矩阵B的各子块在各进程中间循环移动,并完成
相应的矩阵子块乘操作;
, 结果:矩阵C按行存储在各进程中,并与预期正
确结果比较,结果正确,赋标志为0,否则为1,
并将这些标志规约到0号进程,由0号进程打印输
出矩阵乘是否成功完成的信息。
2(求解二维规则区域上 Dirichlet 问题- u = f,有限差分离散,沿两个方向的等网格区域分解,Jacobi迭代求解。
34
35