《MPI并行程序设计自学教程培训课件》由会员分享,可在线阅读,更多相关《MPI并行程序设计自学教程培训课件(52页珍藏版)》请在金锄头文库上搜索。
1、2020/10/29,1,并行程序设计简介,曙光信息产业(北京)有限公司,2020/10/29,2,讲座内容提示,基本概念 基本的MPI 点到点通信(Point to point) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 实例,2020/10/29,3,参考文献,MPI-the complete reference. Marc Snir, MIT Press, 1998. ISBN 0262692155, 0262692163. Using MPI : portable parallel programming with the message-pass
2、ing interface, William Gropp, MIT Press, 1999. 2nd edition. ISBN 0262571323. Using MPI-2 : advanced features of the message-passing interface. William Gropp, MIT Press, 1999. ISBN 0262571331. 高性能计算并行编程技术-MPI并行程序设计,都志辉,清华大学出版社, 2001年8月。,2020/10/29,4,多线程库标准 Win32 API. POSIX threads. 编译制导标准 OpenMP 可移植共
3、享存储并行编程标准. 消息传递库标准 MPI PVM,并行编程标准,本讨论的重点,2020/10/29,5,消息传递并行程序设计,消息传递并行程序设计 指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。 在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。 这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。 并行计算粒度大,特别适合于大规模可扩展并行算法 由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法. 消息传递是当前并行计
4、算领域的一个非常重要的并行程序设计方式,2020/10/29,6,什么是MPI?,Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C 一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用 MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现 MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准,2020/10/29,7,MPI的发展过程,发展的两个阶段 MPI 1.1: 1995 MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和
5、密西西比州立大学联合开发,具有更好的可移植性. MPI 1.22.0:动态进程, 并行 I/O, 远程存储访问、支持F90和C+(1997).,2020/10/29,8,为什么要用MPI?,高可移植性 MPI已在IBM PC机上、MS Windows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。,2020/10/29,9,:从简单入手Init和Finalize,下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序Hel
6、lo (下页). 该程序在终端打印出Hello World!字样. “Hello World”:一声来自新生儿的问候.,2020/10/29,10,Hello world(C),#include #include mpi.h“ main( int argc, char *argv ) MPI_Init( ,2020/10/29,11,Hello world(Fortran),program main include mpif.h integer ierr call MPI_INIT( ierr ) print *, Hello, world! call MPI_FINALIZE( ierr )
7、 end,2020/10/29,12,C和Fortran中MPI函数约定,C 必须包含mpi.h. MPI 函数返回出错代码或 MPI_SUCCESS成功标志. MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写. Fortran 必须包含mpif.h. 通过子函数形式调用MPI,函数最后一个参数为返回值. MPI-前缀,且函数名全部为大写. MPI函数的参数被标志为以下三种类型: IN:参数在例程的调用中不会被修正. OUT:参数在例程的调用中可能会被修正. INOUT:参数有初始值,且在例程的调用中可能会被修正,2020/10/29,13,MPI初始化-MPI_INIT
8、,int MPI_Init(int *argc, char *argv) MPI_INIT(IERROR) MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。 启动MPI环境,标志并行代码的开始. 并行代码之前,第一个mpi函数(除MPI_Initialized()外). 要求main必须带参数运行,否则出错.,2020/10/29,14,MPI结束-MPI_FINALIZE,int MPI_Finalize(void) MPI_FINALIZE(IERROR) MPI_FINALIZE是MPI程序的最后一个调用,它结束
9、MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。 标志并行代码的结束,结束除主进程外其它进程. 之后串行代码仍可在主进程(rank = 0)上运行(如果必须).,2020/10/29,15,MPI程序的的编译与运行,mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码. mpif77 o hello hello.f 或 mpicc o hello hello.c 生成hello的可执行代码. mpirun np 4 a.out mpirun np 4 hello 4 指定np的实参,表示进程数,由用户指定. a.ou
10、t / hello 要运行的MPI并行程序.,%小写o,np: The number of process.,2020/10/29,16,:运行我们的MPI程序!,dairnode01 $ mpicc -o hello hello.c dairnode01 $ ./hello () 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun. dairnode01 $ mpirun -np 4 hello () Hello World! He
11、llo World! Hello World! Hello World! dairnode01 $,计算机打印字符,我们输入的命令,2020/10/29,17,:Hello是如何被执行的?,SPMD: Single Program Multiple Data(SIMD) :,#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
12、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 argc, char *argv ) MPI_Init( ,rshssh,2020/10/29,18,:开始写MPI并行程序 Comm_size和Comm_rank,在写MPI程序时,我们常需要知道以下两个问题的答案: 任务由多少个进程来进
13、行并行计算? 我是哪一个进程?,2020/10/29,19,MPI 提供了下列函数来回答这些问题: 用MPI_Comm_size 获得进程个数 p int MPI_Comm_size(MPI_Comm comm, int *size); 用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的ID int MPI_Comm_rank(MPI_Comm comm, int *rank);,2020/10/29,20,更新的Hello World(c),#include #include mpi.h main( int argc, char *a
14、rgv ) int myid, numprocs; MPI_Init( ,2020/10/29,21,更新的Hello World(F77),program main include mpif.h integer ierr, myid, numprocs call MPI_INIT( ierr ) 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_FINAL
15、IZE( ierr ) end,2020/10/29,22,:运行结果,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 dairnode01 $,计算机打印字符,我们输入的命令,2020/10/29,23,:写MPI并行通信程序-Send和Recv,Greeting执行过程,2020/10/29,24,有消息传递greetings(c),#include #include mpi.h main(int arg
16、c, char* argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init(,2020/10/29,25,有消息传递greetings(c),if (myid != 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 */,2020/10/29,26,解剖greetings程序,头文件: mpi.h/mpif.h.