MPI并行程序设计.ppt
《MPI并行程序设计.ppt》由会员分享,可在线阅读,更多相关《MPI并行程序设计.ppt(219页珍藏版)》请在三一文库上搜索。
1、2019年6月,MPI并行程序设计,1/217,机群应用开发 并行编程原理及 程序设计 Parallel Programming: Fundamentals and Implementation 曙光信息产业有限公司 2019年6月,2019年6月,MPI并行程序设计,2/217,参考文献,黄铠,徐志伟著,陆鑫达等译. 可扩展并行计算技术,结构与编程. 北京:机械工业出版社, P.3356,P.227237, 2000. 陈国良著.并行计算结构、算法、编程. 北京:高等教育出版社,1999. Barry Wilkinson and Michael Allen. Parallel Program
2、ming(Techniques and Applications using Networked Workstations and Parallel Computers). Prentice Hall, 1999. 李晓梅,莫则尧等著. 可扩展并行算法的设计与分析. 北京:国防工业出版社,2000. 张宝琳,谷同祥等著. 数值并行计算原理与方法. 北京:国防工业出版社,1999. 都志辉著. 高性能计算并行编程技术MPI并行程序设计. 北京:清华大学出版社, 2001.,2019年6月,MPI并行程序设计,3/217,相关网址,MPI: http:/ww.mpi-forum.org, http
3、:/www.mcs.anl.gov/mpi Pthreads: http:/ PVM: http:/www.epm.ornl.gov/pvm/ OpemMP: http:/www.openmp.org 网上搜索:,2019年6月,MPI并行程序设计,4/217,MPI并行程序设计 Parallel Programming with the Massage Passing Interface (MPI),2019年6月,MPI并行程序设计,5/217,多线程库标准 Win32 API. POSIX threads. 编译制导标准 OpenMP 可移植共享存储并行编程标准. 消息传递库标准 MPI
4、 PVM,并行编程标准,本讨论的重点,2019年6月,MPI并行程序设计,6/217,消息传递并行程序设计,消息传递并行程序设计 指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。 在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。 这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。 并行计算粒度大,特别适合于大规模可扩展并行算法 由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法. 消息传递是当前并行计算领域的一个非常重要的
5、并行程序设计方式,2019年6月,MPI并行程序设计,7/217,什么是MPI?,Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C 一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用 MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现 MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准,2019年6月,MPI并行程序设计,8/217,MPI的发展过程,发展的两个阶段 MPI 1.1: 1995 MPICH:是MPI最流行的非专利实现,由Ar
6、gonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性. MPI 1.22.0:动态进程, 并行 I/O, 支持F90和C+(1997).,2019年6月,MPI并行程序设计,9/217,为什么要用MPI?,高可移植性 MPI已在IBM PC机上、MS Windows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。,2019年6月,MPI并行程序设计,10/217,讲座内容提示,基本的MPI 基本概念 点到点通信(Point to po
7、int) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 深入MPI 用户自定义(/派生)数据类型(User-defined(Derived) data type) 事实上MPI的所有数据类型均为MPI自定义类型 支持异构系统 允许消息来自不连续的或类型不一致的存储区(结构,数组散元) 集合通信(Collective) 数据移动,数据聚集,同步 基于point to point 构建 MPI环境管理函数 组,上下文和通信空间/通信子的管理 实例,2019年6月,MPI并行程序设计,11/217,从简单入手!,下面我们首先分别以C语言和Fortran语言的形式给出
8、一个最简单的MPI并行程序Hello (下页). 该程序在终端打印出Hello World!字样. “Hello World”:一声来自新生儿的问候.,2019年6月,MPI并行程序设计,12/217,Hello world(C),#include #include “mpi.h“ main( int argc, char *argv ) MPI_Init( ,2019年6月,MPI并行程序设计,13/217,Hello world(Fortran),program main include mpif.h integer ierr call MPI_INIT( ierr ) print *,
9、Hello, world! call MPI_FINALIZE( ierr ) end,2019年6月,MPI并行程序设计,14/217,C和Fortran中MPI函数约定,C 必须包含mpi.h. MPI 函数返回出错代码或 MPI_SUCCESS成功标志. MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写. Fortran 必须包含mpif.h. 通过子函数形式调用MPI,函数最后一个参数为返回值. MPI-前缀,且函数名全部为大写. MPI函数的参数被标志为以下三种类型: IN:参数在例程的调用中不会被修正. OUT:参数在例程的调用中可能会被修正. INOUT:参
10、数在一些例程中为IN,而在另一些例程中为OUT.,2019年6月,MPI并行程序设计,15/217,MPI初始化-MPI_INIT,int MPI_Init(int *argc, char *argv) MPI_INIT(IERROR) MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。 启动MPI环境,标志并行代码的开始. 并行代码之前,第一个mpi函数(除MPI_Initialize()外). 要求main必须带参数运行,否则出错.,2019年6月,MPI并行程序设计,16/217,MPI结束-MPI_FINALIZ
11、E,int MPI_Finalize(void) MPI_FINALIZE(IERROR) MPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。 标志并行代码的结束,结束除主进程外其它进程. 之后串行代码仍可在主进程(rank = 0)上运行(如果必须).,2019年6月,MPI并行程序设计,17/217,MPI程序的的编译与运行,mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码. mpif77 o hello hello.f 或 mpicc o hello
12、hello.c 生成hello的可执行代码. mpirun np 4 a.out mpirun np 4 hello 4 指定np的实参,表示进程数,由用户指定. a.out / hello 要运行的MPI并行程序.,%小写o,np: The number of process.,2019年6月,MPI并行程序设计,18/217,:运行我们的MPI程序!,dairnode01 $ mpicc -o hello hello.c dairnode01 $ ./hello () 0 Aborting program ! Could not create p4 procgroup. Possible
13、missing fileor program started without mpirun. dairnode01 $ mpirun -np 4 hello () Hello World! Hello World! Hello World! Hello World! dairnode01 $,计算机打印字符,我们输入的命令,2019年6月,MPI并行程序设计,19/217,:Hello是如何被执行的?,SPMD: Single Program Multiple Data(SPMD) :,#include “mpi.h“ #include main( int argc, char *argv )
14、 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 main( int ar
15、gc, char *argv ) MPI_Init( ,2019年6月,MPI并行程序设计,20/217,:开始写MPI并行程序,在写MPI程序时,我们常需要知道以下两个问题的答案: 任务由多少个进程来进行并行计算? 我是哪一个进程?,2019年6月,MPI并行程序设计,21/217,:开始写MPI并行程序,MPI 提供了下列函数来回答这些问题: 用MPI_Comm_size 获得进程个数 p int MPI_Comm_size(MPI_Comm comm, int *size); 用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的ID
16、 int MPI_Comm_rank(MPI_Comm comm, int *rank);,2019年6月,MPI并行程序设计,22/217,更新的Hello World(c),#include #include “mpi.h“ main( int argc, char *argv ) int myid, numprocs; MPI_Init( ,2019年6月,MPI并行程序设计,23/217,更新的Hello World(Fortran),program main include mpif.h integer ierr, myid, numprocs call MPI_INIT( ierr
17、 ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) print *, I am, myid, of, numprocs call MPI_FINALIZE( ierr ) end,2019年6月,MPI并行程序设计,24/217,:运行结果,dairnode01 $ mpicc o hello1 hello1.c dairnode01 $ mpirun -np 4 hello1 I am 0 of 4 I am 1 of 4 I am 2
18、 of 4 I am 3 of 4 dairnode01 $,计算机打印字符,我们输入的命令,2019年6月,MPI并行程序设计,25/217,有消息传递 Greeting,2019年6月,MPI并行程序设计,26/217,greetings(c),#include #include “mpi.h“ main(int argc, char* argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init(,2019年6月,MPI并行程序设计,27/217,有消息传递greetings(c),if (m
19、yid != 0) strcpy(message, “Hello World!“); MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99, MPI_COMM_WORLD); else /* myid = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* end main */,2019年6月,MPI并行程序设计,28/217,解剖greetings程序,头文件: mpi.h
20、/mpif.h. int MPI_Init(int *argc, char *argv) 启动MPI环境,标志并行代码的开始. 并行代码之前,第一个mpi函数(除MPI_Initialize()外). 要求main必须带能运行,否则出错. 通信子(通信空间): MPI_COMM_WORLD: 一个通信空间是一个进程组和一个上下文的组合.上下文可看作为组的超级标签,用于区分不同的通信子. 在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信子即被写作MPI_COMM_WORLD. 该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.,201
21、9年6月,MPI并行程序设计,29/217,解剖greetings程序,int MPI_Comm_size ( MPI_Comm comm, int *size ) 获得通信空间comm中规定的组包含的进程的数量. 指定一个communicator,也指定了一组共享该空间的进程, 这些进程组成该communicator的group. int MPI_Comm_rank ( MPI_Comm comm, int *rank ) 得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始). int MPI_Finalize() 标志并行代码的结束,结束除主进程外其它进程. 之后串行代码仍可
22、在主进程(rank = 0)上运行(如果必须).,2019年6月,MPI并行程序设计,30/217,消息传送(先可不关心参数含义),MPI_Send(A, 10, MPI_DOUBLE, 1,99, MPI_COMM_WORLD); MPI_Recv(B, 20, MPI_DOBULE, 0, 99, MPI_COMM_WORLD, ,数据传送 + 同步操作,需要发送方与接收方合作完成.,2019年6月,MPI并行程序设计,31/217,最基本的MPI,MPI调用借口的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的个数确实有限。下面是6个最基本的MPI函数。 MPI_Init()
23、; MPI_Comm_size(); MPI_Comm_rank(); MPI_Send(); MPI_Recv(); MPI_Finalize();,MPI_Init(); 并行代码; MPI_Fainalize(); 只能有串行代码;,2019年6月,MPI并行程序设计,32/217,讲座内容提示,基本的MPI 基本概念 点到点通信(Point to point) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 深入MPI 用户自定义(/派生)数据类型(User-defined(Derived) data type) 事实上MPI的所有数据类型均为MPI自定
24、义类型 支持异构系统 允许消息来自不连续的或类型不一致的存储区(结构,数组散元) 集合通信(Collective) 数据移动,数据聚集,同步 基于point to point 构建 MPI环境管理函数 组,上下文和通信空间/通信子的管理 实例,2019年6月,MPI并行程序设计,33/217,Point to Point,单个进程对单个进程的通信,重要且复杂 术语 Blocking(阻塞) :一个例程须等待操作完成才返回,返回后用户可以重新使用调用中所占用的资源. Non-blocking(非阻塞):一个例程不必等待操作完成便可返回,但这并不意味着所占用的资源可被重用. Local(本地):不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MPI 并行 程序设计
链接地址:https://www.31doc.com/p-2977066.html