MPI并行编程

上传人:飞****9 文档编号:143101815 上传时间:2020-08-26 格式:PPT 页数:35 大小:206KB
返回 下载 相关 举报
MPI并行编程_第1页
第1页 / 共35页
MPI并行编程_第2页
第2页 / 共35页
MPI并行编程_第3页
第3页 / 共35页
MPI并行编程_第4页
第4页 / 共35页
MPI并行编程_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《MPI并行编程》由会员分享,可在线阅读,更多相关《MPI并行编程(35页珍藏版)》请在金锄头文库上搜索。

1、MPI并行编程,大纲,MPI并行编程简介 Linux下MPI并行编程环境的搭建 MPI并行程序设计 实例分析:矩阵乘法,1.1 什么是并行计算,传统的串行计算,分为“指令” 和“数据”两个部分,并在程序 执行时“独立地申请和占有”内 存空间,且所有计算均局限于 该内存空间。,并行计算将进程相对独立的 分配于不同的节点上,由 各自独立的操作系统调度, 享有独立的CPU和内存资源 (内存可以共享);进程间 相互信息交换通过消息传递;,进程 1,进程 2,1.2 并行计算在电力行业的研究和应用,中国电科院发明专利“电力系统潮流分网并行计算方法”获得中国专利金奖(发明人:周孝信、吴中习、郭剑、李亚楼、

2、田芳)2010.11 大规模电网并行潮流算法2008 电力系统状态估计的分布式并行处理2003 电力系统最优潮流的分布式并行算法2003 电网在线安全分析的并行处理方法 1996 基于GPU的电力系统并行潮流计算的实现 2010 基于MPI和PQ分解法的电力系统潮流并行算法的研究2005 基于并行计算的电力系统风险评估2009 基于并行协调算法的电力系统状态估计2007 基于改进并行遗传算法的电网状态估计2006 应用网格平台的潮流计算并行算法2009 基于MPI电力系统潮流PQ分解法的并行算法2008 2008电网控制中心新技术综述2009,1.3 并行编程标准,多线程库标准 Win32 A

3、PI. POSIX threads. 编译制导标准 OpenMP 可移植共享存储并行编程标准. 消息传递库标准 MPI PVM,1.4 Massage Passing Interface(MPI),MPI 是由MPI 委员会(MPI Forum)在1992年到1994年举行的一系列会议上逐渐产生的一个消息传递标准( http:/www.mpi-forum.org/ )。 发展 MPI 1.1: 1995 MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性. MPI 1.2 (1997) . MPI 2.2 (2009-09),MPI

4、是一个库,而不是一门语言,这个标准支持 C 语言和 FORTRAN 语言 MPI库可以被FORTRAN77/C/Fortran90/C+调用 它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别,MPI是一种标准或规范,而不是具体实现,实现:Mpich、OpenMPI、Chimp、Lam,例如:MPI_Init(int *argc, char *argv )的实现,MPICH的实现 int MPI_Init( int *argc, char *argv ) static const char FCNAME = MPI_Init; int mpi_errno = MPI_SUCCE

5、SS; int rc; 。 ,OpenMPI的实现 int MPI_Init( int *argc, char *argv ) int err; int provided; char *env; int required = MPI_THREAD_SINGLE; 。 ,MPI是一种消息传递编程模型,节点间基于消息进行通讯,2.1 MPICH的实验环境,实验环境: RedHat 9.0 + Vmware 6.0 + MPICH 2-1.0 Fedora 14+ Dell Blade*1(主节点)+Dell PC*2(从节点) +MPICH 2-1.2.1p1,2.2 MPICH的搭建步骤,搭建步

6、骤 1-挂载NFS文件系统 实现分节点内容与主节点内容的同步更新和自动目录对应 2-配置SSH公钥认证实现MPI节点间用户的无密码访问 各节点间进行消息传递 3-安装MPICH至NFS目录 4-修改各种配置文件 5-试运行example文件夹中的例子,3.1 基于MPI的Hello World(C),#include #include mpi.h“ main( int argc, char *argv ) MPI_Init( ,2020/8/26,13,3.2 MPI程序的的编译与运行,mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码.(mpicc

7、hello.c) mpif77 o hello hello.f 或 mpicc o hello hello.c 生成hello的可执行代码. mpirun np 4 a.out mpirun np 4 hello 4 指定np的实参,表示进程数,由用户指定. a.out / hello 要运行的MPI并行程序.,%小写o,np: The Number of Process.,3.3 运行MPI程序,dairnode01 $ mpicc -o hello hello.c dairnode01 $ ./hello () 0 Aborting program ! Could not create p

8、4 procgroup. Possible missing fileor program started without mpirun. dairnode01 $ mpirun -np 4 hello () Hello World! Hello World! Hello World! Hello World! dairnode01 $,计算机打印字符,我们输入的命令,2020/8/26,15,3.4 Hello World是如何被执行的?,SPMD: Single Program Multiple Data(SPMD) :,#include mpi.h #include main( int a

9、rgc, char *argv ) MPI_Init( ,#include mpi.h #include main( int argc, char *argv ) MPI_Init( ,#include mpi.h #include main( int argc, char *argv ) MPI_Init( ,#include mpi.h #include main( int argc, char *argv ) MPI_Init( ,Hello World! Hello World! Hello World! Hello World!,#include mpi.h #include mai

10、n( int argc, char *argv ) MPI_Init( ,MPI程序的执行过程,3.5 进一步的MPI并行程序,在写MPI程序时,我们常需要知道以下两个问题的答案: 任务由多少个进程来进行并行计算?(多少个节目) 我是哪一个进程? (节目名程) 好比是晚会导演安排节目次序,每个节目拿到的是相同的节目单。对号入座,3.5.1 MPI相关接口,MPI 提供了下列函数来回答这些问题: 用MPI_Comm_size 获得进程个数 p int MPI_Comm_size(MPI_Comm comm, int *size); 用MPI_Comm_rank 获得进程的一个叫rank的值,该

11、rank值为0到p-1间的整数,相当于进程的ID int MPI_Comm_rank(MPI_Comm comm, int *rank);,3.5.2 更新的Hello World(c),#include #include mpi.h main( int argc, char *argv ) int myid, numprocs; MPI_Init( ,运行结果,dairnode01 $ mpicc o hello1 hello1.c dairnode01 $ mpirun -np 4 hello1 I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4

12、 dairnode01 $,计算机打印字符,我们输入的命令,3.6.1 MPI消息,消息:指在进程间进行的一次数据交换。 一个消息由源地址、数据个数、数据类型、目标地址、消息标识和通信体构成。 消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。 MPI_Send(buf,count,datatype,dest,tag,comm),3.6.2 消息传递过程,3.6.3 MPI点对点通信函数,MPI_Send ( void * buf, int count, MPI_Datatype datatype, int dest, int tag, MPI

13、_Comm comm ),被发送消息的地址,被发送数据项的个数,消息数据的类型,目标进程的序号,消息标志,通信体,3.6.3 MPI点对点通信函数,MPI_Recv ( void * buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status ),被接收消息的地址,被接收数据项的个数,消息数据的类型,源进程的序号,消息标志,通信体,返回的通信状态,3.6.4 加入消息传递的HelloWorld(c),#include #include mpi.h“ main(int

14、argc, char* argv) int numprocs; /*进程数,该变量为各处理器中的同名变量, 存储是分布的*/ int myid;/*我的进程ID,存储也是分布的*/ MPI_Status status; /*消息接收状态变量,存储也是分布的*/ char message100;/*消息buffer,存储也是分布的*/ /*初始化MPI*/ MPI_Init(,3.6.4 加入消息传递的HelloWorld(c) (续),if (myid != 0) /*建立消息*/ sprintf(message, “HelloWorld from process %d!,myid); /*

15、发送长度取strlen(message)+1,使0也一同发送出去*/ MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99,MPI_COMM_WORLD); else /* my_rank = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* End main */,问题:进程1、2、3谁先向进程0发送消息?,?,运行结果,dairnode01 $ mpicc o hello

16、2 hello2.c dairnode01 $ mpirun -np 4 hello2 HelloWorld from process 1! HelloWorld from process 2! HelloWorld from process 3! dairnode01 $,计算机打印字符,我们输入的命令,3.7 最基本的MPI,MPI调用借口的总数虽然庞大(几百个),但根据实际编写MPI的经验,常用的MPI调用的个数确实有限。 下面是6个最基本的MPI函数。 MPI_Init(); MPI_Comm_size(); MPI_Comm_rank(); MPI_Send(); MPI_Recv(); MPI_Finalize();,MPI_Init(); 并行代码; MPI_Fa

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号