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