消息传递并行编程环境MPI.docx
《消息传递并行编程环境MPI.docx》由会员分享,可在线阅读,更多相关《消息传递并行编程环境MPI.docx(22页珍藏版)》请在冰豆网上搜索。
消息传递并行编程环境MPI
国家973项目高性能计算环境支持讲座
MPI与PETSc
日期
内容
8.15
上午
进程与消息传递、
MPI应用现状、
MPI并行程序设计入门、
初步的MPI消息传递函数
下午
作业一、讨论
8.16
上午
作业一讲评、
先进的MPI函数、
并行程序示例2、
MPI的发展
下午
作业二、讨论
8.17
上午
作业二讲评、
并行可扩展科学计算工具箱PETSc介绍
下午
PETSc程序示例
个人介绍
莫则尧,男,汉族,1971年7月生,副研究员:
●1992年国防科技大学应用数学专业本科毕业;
●1997年国防科技大学计算机应用专业并行算法方向博士毕业;
●1999年北京应用物理与计算数学数学博士后流动站出站,并留所工作;
●主要从事大规模科学与工程并行计算研究。
消息传递并行编程环境MPI
一、进程与消息传递
二、MPI环境的应用现状
三、MPI并行程序设计入门(程序例1)
四、初步的MPI消息传递函数
五、作业一
六、先进的MPI函数
七、MPI并行程序示例2(求解-u=f);
八、MPI环境的发展
九、作业二
一、进程与消息传递
1.单个进程(process)
●进程是一个程序,同时包含它的执行环境(内存、寄存器、程序计数器等),是操作系统中独立存在的可执行的基本程序单位;
●通俗理解:
串行应用程序编译形成的可执行代码,分为“指令”和“数据”两个部分,并在程序执行时“独立地申请和占有”内存空间,且所有计算均局限于该内存空间。
进程1
进程2
内存
2.单机内多个进程:
●多个进程可以同时存在于单机内同一操作系统:
由操作系统负责调度分时共享处理机资源(CPU、内存、存储、外设等);
●进程间相互独立(内存空间不相交):
在操作系统调度下各自独立地运行,例如多个串行应用程序在同一台计算机中运行;
●进程间可以相互交换信息:
例如数据交换、同步等待,消息是这些交换信息的基本单位,消息传递是指这些信息在进程间的相互交换,是实现进程间通信的唯一方式;
●最基本的消息传递操作:
发送消息(send)、接受消息(receive)、进程同步(barrier)、规约(reduction);
●消息传递的实现:
共享内存或信号量,用户不必关心;
进程1进程2
发送数据接收数据
(消息传递)
内存空间
3.包含于通过网络联接的不同计算机的多个进程:
●进程独立存在:
进程位于不同的计算机,由各自独立的操作系统调度,享有独立的CPU和内存资源;
●进程间相互信息交换:
消息传递;
●消息传递的实现:
基于网络socket机制,用户不必关心;
4.消息传递库函数:
●应用程序接口(API):
提供给应用程序(FORTRAN、C、C++语言)的可直接调用的完成进程间消息传递的某项特定功能的函数;
●消息传递库:
所有定义的消息传递函数编译形成的软件库,调用其内部函数的应用程序,通过与之联接,即可成为可并行执行的程序;
●目前流行的消息传递函数库:
PVM3.3.11、MPICH1.2、LAMMPI6.4等;
5.标准消息传递界面(MPI:
MessagePassingInterface):
●MPI标准:
根据应用程序对消息传递功能的需求,全球工业、应用和研究部门联合推出标准的消息传递界面函数,不考虑其具体实现,以保证并行应用程序的可移植性;
●MPI的具体实现:
消息传递库函数,目前有影响的为MPICH和LAMMPI,我们注重MPICH系列;
6.基于消息传递的并行程序执行模式:
●SPMD模式:
单程序多数据流
并行应用程序代码
可执行代码
运行
复制多份并独立执行,形成多个独立的进程
进程三(内存)
进程二(内存)
进程一(内存)
消息传递(交换数据、同步、规约)协同
●MPMD模式:
多程序多数据流,除初始启动多个可执行代码,其余与SPMD模式一致;
7.共享存储与分布式存储:
●属于并行机体系结构的范畴,与消息传递并行程序设计平台无关;
节点
CPU
CPU
CPU
CPU
CPU
CPU
M
M
M
互连网络
互连网络
M
M
M
分布式存储共享存储
●消息传递是相对于进程间通信方式而言的,与具体并行机存储模式无关,任何支持进程间通信的并行机,均可支持消息传递并行程序设计;
●几乎所有共享和分布存储并行计算环境均支持进程间的消息传递通信;
二、MPI环境的应用现状
●MPI(消息传递界面)是全球工业、政府和科研部门联合推出的适合进程间进行标准消息传递的并行程序设计平台,最初版MPI1.0本于1994年6月推出,目前最新的为MPI2.0版,于1998年年低推出;
●MPI的具体实现:
MPICH和LAMMPI,目前均已实现MPI1.2版,适用于任何并行计算平台;部分并行机已实现MPI2.0版;
●MPI是目前应用最广的并行程序设计平台,几乎被所有并行计算环境(共享和分布式存储并行机、MPP、机群系统等)和流行的多进程操作系统(UNIX、WindowsNT)所支持,基于它开发的应用程序具有最佳的可移植性;
●目前高效率的超大规模并行计算(1000个处理器)最可信赖的平台;
●工业、科学与工程计算部门的大量科研和工程软件(气象、石油、地震、空气动力学、核等)目前已经移植到MPI平台,发挥了重要作用;
●目前,MPI相对于PVM:
Ø优点:
功能强大,性能高,适应面广,使用方便,可扩展性好;
Ø缺点:
进程数不能动态改变;
三、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负责广播该数给所有进程,并打印输出。
programexample1
include“mpif.h”!
!
MPI系统头文件
integerstatus(MPI_STATUS_SIZE),my_rank,p,source,dest,tag,ierr,data
c
c-------进入MPI系统
callMPI_Init(ierr)
callMPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr)
callMPI_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
callMPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr)
callMPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr)
else
callMPI_Recv(data,1,MPI_INTEGER,source,tag,MPI_COMM_WORLD,status,ierr)
data=data+1
callMPI_Send(data,1,MPI_INTEGER,dest,tag,MPI_COMM_WORLD,ierr)
endif
c
c-------广播数据
callMPI_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
callMPI_Finalize(ierr)
end
●
编译命令:
mpif77-oexam.eexample.f
●运行命令:
mpirun–np4exam.e
●运行效果:
MPI系统选择相同或不同的4个处理机,在每个处理机上运行程序代码exam.e。
MPI函数进程0进程1进程2进程3
进入MPI系统
Init()
Comm_rank()my_rank=0myrank=1myrank=2my_rank=3
Comm_size()p=4p=4p=4p=4
tag=5,data=0tag=5,data=0tag=5,data=0tag=5,data=0
source=3source=0source=1source=2
dest=1dest=2dest=3dest=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()
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,DOUBLEPRECISION,COMPLEX,LOGICAL,CHARACTER),MPI系统提供已定义好的对应数据类型(MPI_INTEGER,MPI_REAL,MPI_DOUBLE_PRECISION,MPI_COMPLEX,MPI_LOGICAL,MPI_CHARACTER);
●自定义数据类型:
基于基本数据类型,用户自己定义的数据类型(后面介绍);
●MPI对象:
MPI系统内部定义的数据结构,包括数据类型、进程组、通信器等,它们对用户不透明,在