节点 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: ➢ 优点:功能强大,性能高,适应面广,使用方便,可 扩展性好;
>缺点:进程数不能动态改变:
10 ➢ 缺点:进程数不能动态改变;
三、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