消息传递并行编程环境MPI 一、进程与消息传递 二、MPI环境的应用现状 三、MPI并行程序设计入门(程序例1) 四、初步的MPI消息传递函数 五、作业一 六、先进的MPI函数 七、MPI并行程序示例2(求解-△u=f): 八、MPI环境的发展 九、作业二
3 消息传递并行编程环境 MPI 一、 进程与消息传递 二、 MPI 环境的应用现状 三、 MPI 并行程序设计入门(程序例 1) 四、 初步的 MPI 消息传递函数 五、 作业一 六、 先进的 MPI 函数 七、 MPI 并行程序示例 2(求解-u=f); 八、 MPI 环境的发展 九、 作业二
一、进程与消息传递 1.单个进程(process) ●进程是一个程序,同时包含它的执行环境(内存、寄 存器、程序计数器等),是操作系统中独立存在的可 执行的基本程序单位: ●通俗理解:串行应用程序编译形成的可执行代码,分 为“指令”和“数据”两个部分,并在程序执行时“独 立地申请和占有”内存空间,且所有计算均局限于该 内存空间。 进程1 进程2 一内存 2.单机内多个进程 ●多个进程可以同时存在于单机内同一操作系统:由操 作系统负责调度分时共享处理机资源(CPU、内存、 存储、外设等): 。进程间相互独立(内存空间不相交):在操作系统调 度下各自独立地运行,例如多个串行应用程序在同一 台计算机中运行: ·进程间可以相互交换信息:例如数据交换、同步等待, 消息是这些交换信息的基本单位,悄息传递是指这
4 一、进程与消息传递 1.单个进程(process) ⚫ 进程是一个程序,同时包含它的执行环境(内存、寄 存器、程序计数器等),是操作系统中独立存在的可 执行的基本程序单位; ⚫ 通俗理解:串行应用程序编译形成的可执行代码,分 为“指令”和“数据”两个部分,并在程序执行时“独 立地申请和占有”内存空间,且所有计算均局限于该 内存空间。 2.单机内多个进程: ⚫ 多个进程可以同时存在于单机内同一操作系统:由操 作系统负责调度分时共享处理机资源(CPU、内存、 存储、外设等); ⚫ 进程间相互独立(内存空间不相交):在操作系统调 度下各自独立地运行,例如多个串行应用程序在同一 台计算机中运行; ⚫ 进程间可以相互交换信息:例如数据交换、同步等待, 消息是这些交换信息的基本单位,消息传递是指这 进程 1 进程 2 内存
些信息在进程间的相互交换,是实现进程间通信的唯 一方式: ●最基本的消息传递操作:发送消息(send)、接受消 息(receive)、进程同步(barrier)、规约(reduction); 。消息传递的实现:共享内存或信号量,用户不必关心: 进程1 进程2 发送数据口 接收数据口 (消息传递 内存空间 3.包含于通过网络联接的不同计算机的多个进程: ●进程独立存在:进程位于不同的计算机,由各自独立 的操作系统调度,享有独立的CPU和内存资源; ·进程间相互信息交换:消息传递: ●消息传递的实现:基于网络socket机制,用户不必关 心; 4.消息传递库函数 ●应用程序接口(API):提供给应用程序(FORTRAN、 C、C+语言)的可直接调用的完成进程间消息传递 5
5 些信息在进程间的相互交换,是实现进程间通信的唯 一方式; ⚫ 最基本的消息传递操作:发送消息(send)、接受消 息(receive)、进程同步(barrier)、规约(reduction); ⚫ 消息传递的实现:共享内存或信号量,用户不必关心; 进程 1 进程 2 发送数据 接收数据 (消息传递) 内存空间 3.包含于通过网络联接的不同计算机的多个进程: ⚫ 进程独立存在:进程位于不同的计算机,由各自独立 的操作系统调度,享有独立的 CPU 和内存资源; ⚫ 进程间相互信息交换:消息传递; ⚫ 消息传递的实现:基于网络 socket 机制,用户不必关 心; 4.消息传递库函数: ⚫ 应用程序接口(API):提供给应用程序(FORTRAN、 C、C++语言)的可直接调用的完成进程间消息传递
的某项特定功能的函数: ●消息传递库:所有定义的消息传递函数编译形成的软 件库,调用其内部函数的应用程序,通过与之联接, 即可成为可并行执行的程序: ●目前流行的消息传递函数库:PVM3.3.11、MPICH 1.2、LAMMPI6.4等: 5.标准消息传递界面(MPI:Message Passing Interface): ●MPI标准:根据应用程序对消息传递功能的需求, 全球工业、应用和研究部门联合推出标准的消息传递 界面函数,不考虑其具体实现,以保证并行应用程序 的可移植性: ●MPI的具体实现:消息传递库函数,目前有影响的 为MPICH和LAMMPI,我们注重MPICH系列; 6
6 的某项特定功能的函数; ⚫ 消息传递库:所有定义的消息传递函数编译形成的软 件库,调用其内部函数的应用程序,通过与之联接, 即可成为可并行执行的程序; ⚫ 目前流行的消息传递函数库:PVM 3.3.11、MPICH 1.2、LAMMPI 6.4 等; 5.标准消息传递界面(MPI:Message Passing Interface): ⚫ MPI 标准:根据应用程序对消息传递功能的需求, 全球工业、应用和研究部门联合推出标准的消息传递 界面函数,不考虑其具体实现,以保证并行应用程序 的可移植性; ⚫ MPI 的具体实现:消息传递库函数,目前有影响的 为 MPICH 和 LAMMPI,我们注重 MPICH 系列;
6.基于消息传递的并行程序执行模式: ●SPMD模式:单程序多数据流 并行应用程序代码 一可执行代码 运行 复制多份并独立执行,形 成多个独立的进程 禮 进程一 (内存 (内存) (内存) 消息传递(交换数据、同步、规约)协同 ●MPMD模式:多程序多数据流,除初始启动多个可 执行代码,其余与SPMD模式一致: 7.共享存储与分布式存储: ·。属于并行机体系结构的范畴,与消息传递并行程序设 计平台无关:
7 6.基于消息传递的并行程序执行模式: ⚫ SPMD 模式:单程序多数据流 可执行代码 运行 ⚫ MPMD 模式:多程序多数据流,除初始启动多个可 执行代码,其余与 SPMD 模式一致; 7.共享存储与分布式存储: ⚫ 属于并行机体系结构的范畴,与消息传递并行程序设 计平台无关; 并行应用程序代码 复制多份并独立执行,形 成多个独立的进程 进 程 一 ( 内 存 ) 进 程 二 ( 内 存 ) 进 程 三 ( 内 存 ) 消息传递(交换数据、同步、规约)协同
节点 CPU CPU CPU CPU CPU M M M 互连网络 互连网络 M MM 分布式存储 共享存储 ·消息传递是相对于进程间通信方式而言的,与具体并 行机存储模式无关,任何支持进程间通信的并行机, 均可支持消息传递并行程序设计: ·几乎所有共享和分布存储并行计算环境均支持进程 间的消息传递通信:
8 节点 分布式存储 共享存储 ⚫ 消息传递是相对于进程间通信方式而言的,与具体并 行机存储模式无关,任何支持进程间通信的并行机, 均可支持消息传递并行程序设计; ⚫ 几乎所有共享和分布存储并行计算环境均支持进程 间的消息传递通信; CPU CPU CPU 互连网络 M M M CPU CPU CPU 互连网络 M M M
二、MPI环境的应用现状 ●MPI(消息传递界面)是全球工业、政府和科研部门联 合推出的适合进程间进行标准消息传递的并行程序设 计平台,最初版MPI1.0本于1994年6月推出,日前 最新的为MPI2.0版,于1998年年低推出: ●MPI的具体实现:MPICH和LAMMPI,目前均已实现 MPI1.2版,适用于任何并行计算平台:部分并行机已 实现MPI2.0版: ●MPI是目前应用最广的并行程序设计平台,几乎被所有 并行计算环境(共享和分布式存储并行机、MPP、机群 系统等)和流行的多进程操作系统(UNIX、Windows NT)所支持,基于它开发的应用程序具有最佳的可移 植性; ●目前高效率的超大规模并行计算(1000个处理器)最 可信赖的平台; ·工业、科学与工程计算部门的大量科研和工程软件(气 象、石油、地震、空气动力学、核等)目前已经移植到 MPI平台,发挥了重要作用; ●目前,MPI相对于PVM: >优点:功能强大,性能高,适应面广,使用方便,可 扩展性好; 9
9 二、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: ➢ 优点:功能强大,性能高,适应面广,使用方便,可 扩展性好;
三、MPI并行程序设计入门 1.MPI并行程序设计平台由标准消息传递函数及相关辅助 函数构成,多个进程通过调用这些函数(类似调用子程 序),进行通信: 2.MPI程序: ●SPMD执行模式:一个程序同时启动多份,形成多个 独立的进程,在不同的处理机上运行,拥有独立的内 存空间,进程间通信通过调用MPI函数来实现; ·每个进程开始执行时,将获得一个唯一的序号 (rank)。例如启动P个进程,序号依次为0,1,., P-1; ●MPI程序例1:进程0发送一个整数给进程1:进程 1将该数加1,传递给进程2;进程2再将该数加1, 再传递给进程3;依次类推,最后,进程P1将该数 传递给进程0,由进程0负责广播该数给所有进程, 并打印输出
11 三、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 负责广播该数给所有进程, 并打印输出
program examplel include "mpifh" IMPI系统头文件 integer status(MPI_STATUS_SIZE).my_rank,p,source,dest,tag.ierr,data c-进入MPI系统 call MPI Init(ier)) call MPI_Comm_rank(MPI_COMM_WORLD.my_rank.ierr) call MPI_Comm_size(MPI_COMM_WORLD.p.ierr) C。一数据交换 data=0 tag =5 source=my_rank-1 if(source.eq.-1)source=p-1 dest =my rank+l if(dest.eq-p)dest=0 if(my_rank.eq.0)then calIMPI_Send(data.1.MPI_INTEGER.dest.tag.MPI_COMM_WORLD.ierr) call MPI_Reev(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+l MPI Send(data.1.MPI INTEGER.dest,tag MPI_COMM WORLD.ic 。一广播数据 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 endif c call MPI Finalize(ierr) end
12 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