《并行编程初步教程文件.ppt》由会员分享,可在线阅读,更多相关《并行编程初步教程文件.ppt(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、并行编程初步两种内存模型两种内存模型共享存储共享存储分布式存储分布式存储内内 存存CPUCPUCPUCPUCPU内存内存CPUCPUCPUCPUCPU内存内存内存内存内存内存内存内存消息传递并行程序设计消息传递并行程序设计消息传递并行程序设计消息传递并行程序设计 用户必须通过显式地发送和接收消息来实现处理机间的用户必须通过显式地发送和接收消息来实现处理机间的数据交换数据交换 每个并行进程均有自己独立的地址空间,相互之间访问每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现不能直接进行,必须通过显式的消息传递来实现 适用于大规模并行处理机(适用于大规模并行
2、处理机(MPPMPP)和机群()和机群(ClusterCluster)并行计算粒度大,适合大规模可扩展并行算法并行计算粒度大,适合大规模可扩展并行算法 消息传递程序设计要求用户很好地分解问题消息传递程序设计要求用户很好地分解问题,组织不同进组织不同进程间的数据交换程间的数据交换,并行计算粒度大并行计算粒度大,特别适合于大规模可特别适合于大规模可扩展并行算法扩展并行算法什么是什么是MPI?Massage Passing Interface:Massage Passing Interface:是消息传递函数库是消息传递函数库的标准规范,由的标准规范,由MPIMPI论坛开发,支持论坛开发,支持For
3、tranFortran和和C C 一种新的库描述,不是一种语言一种新的库描述,不是一种语言 共有上百个函数调用接口,在共有上百个函数调用接口,在FortranFortran和和C C语言中可以直语言中可以直接对这些函数进行调用接对这些函数进行调用 是一种标准或规范,而不是特指某一个对它的具体实现是一种标准或规范,而不是特指某一个对它的具体实现 MPIMPI是一种消息传递编程模型,并成为这种编程模型的是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准代表和事实上的标准为什么要使用为什么要使用MPI?高可移植性高可移植性 MPIMPI已在已在PCPC机、机、MS WindowsMS W
4、indows以及所有主要的以及所有主要的UnixUnix工作站上和所有主流的并行机上得到实现工作站上和所有主流的并行机上得到实现 使用使用MPIMPI作消息传递的作消息传递的C C或或FortranFortran并行程序可不加并行程序可不加改变地在上述平台实现改变地在上述平台实现没有更好的选择没有更好的选择MPI的发展过程的发展过程发展的两个阶段发展的两个阶段 19941994年年5 5月完成月完成1.01.0版版 支持支持C C和和Fortran77Fortran77 制定大部分并行功能制定大部分并行功能 19971997年年4 4月完成月完成2.02.0版版 动态进程动态进程 并行并行I/
5、OI/O 支持支持Fortran 90Fortran 90和和C+C+常用的常用的MPI版本版本 MPICH MPICH 是是MPIMPI最流行的非专利实现最流行的非专利实现,由由ArgonneArgonne国家实验室和密西西比国家实验室和密西西比州立大学联合开发州立大学联合开发,具有更好的可移植性具有更好的可移植性 当前最新版本有当前最新版本有MPICH 1.2.7MPICH 1.2.7和和MPICH2 1.03MPICH2 1.03 LAMMPILAMMPI 美国美国Indiana Indiana 大学大学Open Systems Open Systems 实验室实现实验室实现 当前最新版
6、本当前最新版本7.1.27.1.2 更多的商业版本更多的商业版本MPIMPI HP-MPIHP-MPI,MS-MPIMS-MPI,所有的版本遵循所有的版本遵循MPIMPI标准,标准,MPIMPI程序可以不加修改的运行程序可以不加修改的运行提提 纲纲引言引言基本基本MPIMPI编程编程MPIMPI高级编程简介高级编程简介实例实例从简单入手从简单入手下面我们首先分别以下面我们首先分别以C C语言和语言和FortranFortran语言的形语言的形式给出一个最简单的式给出一个最简单的MPIMPI并行程序并行程序 Hello Hello 该程序在终端打印出该程序在终端打印出Hello World!He
7、llo World!字样字样.Hello(C语言语言)#include#include mpi.h“main(int argc,char*argv)MPI_Init(&argc,&argv);printf(“Hello World!n);MPI_Finalize();Hello(Fortran语言语言)program maininclude mpif.hinteger ierrcall MPI_INIT(ierr)print*,Hello,world!call MPI_FINALIZE(ierr)endC和和Fortran中中MPI函数约定函数约定 C C 必须包含必须包含mpi.hmpi.h
8、 MPI MPI 函数返回出错代码或成功代码函数返回出错代码或成功代码MPI_SUCCESSMPI_SUCCESS MPI-MPI-前缀,且只有前缀,且只有MPIMPI以及以及MPI_MPI_标志后的第一个字母大写,标志后的第一个字母大写,其余小写,例:其余小写,例:MPI_InitMPI_Init FortranFortran 必须包含必须包含mpif.hmpif.h 通过子函数形式调用通过子函数形式调用MPIMPI,函数最后一个值为返回值,函数最后一个值为返回值 MPI-MPI-前缀,且函数名全部大写,例:前缀,且函数名全部大写,例:MPI_INITMPI_INIT C C和和Fortra
9、nFortran中中MPIMPI函数约定(续)函数约定(续)MPIMPI函数的参数被标志为以下三种类型函数的参数被标志为以下三种类型 ININ:参数在函数的调用中不会被修改:参数在函数的调用中不会被修改 OUTOUT:参数在函数的调用中可能会被修改:参数在函数的调用中可能会被修改 INOUTINOUT:参数在一些函数中为:参数在一些函数中为ININ,而在另一些函数中为,而在另一些函数中为OUTOUT MPIMPI初始化初始化-MPI_INIT-MPI_INIT int MPI_Init(int*argc,char*argv)int MPI_Init(int*argc,char*argv)MPI
10、_INIT(IERROR)MPI_INIT(IERROR)MPI_INITMPI_INIT是是MPIMPI程序的第一个调用,完成程序的第一个调用,完成MPIMPI程序的所有初始化程序的所有初始化工作。所有的工作。所有的MPIMPI程序的第一条可执行语句都是这条语句程序的第一条可执行语句都是这条语句 启动启动MPIMPI环境,标志并行代码的开始环境,标志并行代码的开始 并行代码之前,第一个并行代码之前,第一个mpimpi函数函数(除除MPI_InitializeMPI_Initialize外外)要求要求mainmain必须带参数运行。否则出错必须带参数运行。否则出错 MPIMPI结束结束-MPI
11、_FINALIZE-MPI_FINALIZE int MPI_Finalize(void)int MPI_Finalize(void)MPI_ Finalize(IERROR)MPI_ Finalize(IERROR)MPI_INITMPI_INIT是是MPIMPI程序的最后一个调用,它结束程序的最后一个调用,它结束MPIMPI程序的运程序的运行,它是行,它是MPIMPI程序的最后一条可执行语句,否则程序的运行结程序的最后一条可执行语句,否则程序的运行结果是不可预知的。果是不可预知的。标志并行代码的结束标志并行代码的结束,结束除主进程外其它进程结束除主进程外其它进程 之后串行代码仍可在主进程之
12、后串行代码仍可在主进程(rank=0)(rank=0)上运行上运行(如果必须如果必须)MPIMPI程序的编译和运行程序的编译和运行mpif77 o hello hello.fmpif77 o hello hello.f 或或 mpicc o hello hello.c mpicc o hello hello.c 生成生成hellohello的可执行代码的可执行代码mpirun np 4 hellompirun np 4 hello 4 4,指定,指定npnp的值的值,表示进程数表示进程数,由用户指定由用户指定 hellohello,要运行的,要运行的MPIMPI并行程序并行程序 运行MPI程序
13、 编译:编译:mpicc-o hello hello.cmpicc-o hello hello.c 运行:运行:./hello./hello 0 Aborting program!Could not create p4 0 Aborting program!Could not create p4 procgroup.Possible missing fileor program started procgroup.Possible missing fileor program started without mpirun.without mpirun.运行:运行:mpirun-np 4 hel
14、lompirun-np 4 helloHello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!Hello World!HelloHello是如何被执行的?是如何被执行的?SPMD:Single Program Multiple Data(MIMD)SPMD:Single Program Multiple Data(MIMD)#include#include mpi.h“main(int argc,char*argv)MPI_Init(&argc,&argv);printf(“Hell
15、o World!n);MPI_Finalize();#include#include mpi.h“main(int argc,char*argv)MPI_Init(&argc,&argv);printf(“Hello World!n);MPI_Finalize();#include#include mpi.h“main(int argc,char*argv)MPI_Init(&argc,&argv);printf(“Hello World!n);MPI_Finalize();#include#include mpi.h“main(int argc,char*argv)MPI_Init(&arg
16、c,&argv);printf(“Hello World!n);MPI_Finalize();#include#include mpi.h“main(int argc,char*argv)MPI_Init(&argc,&argv);printf(“Hello World!n);MPI_Finalize();Hello World!Hello World!Hello World!Hello World!开始写开始写MPIMPI程序程序写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少进程来进行并行计算?任务由多少进程来进行并行计算?我是哪一个进程?我是哪一个进程?开始写开始写MPIMP
17、I程序程序 MPIMPI提供了下列函数来回答这些问题:提供了下列函数来回答这些问题:用用MPI_Comm_size MPI_Comm_size 获得进程个数获得进程个数p p int MPI_Comm_size(MPI_Comm comm,int*size)int MPI_Comm_size(MPI_Comm comm,int*size)用用MPI_Comm_rank MPI_Comm_rank 获得进程的一个叫获得进程的一个叫rankrank的值,该的值,该 rank rank值为值为0 0到到p-1p-1间的整数间的整数,相当于进程的相当于进程的IDID int MPI_Comm_rank
18、(MPI_Comm comm,int*rank)int MPI_Comm_rank(MPI_Comm comm,int*rank)更新的更新的Hello World(C语言语言)#include#include mpi.h”main(int argc,char*argv)int myid,numprocs;MPI_Init(&argc,&argv);MPI_Common_rank(MPI_COMMON_WORLD,&myid);MPI_Common_size(MPI_COMMON_WORLD,&numprocs);printf(“I am%d of%d n“,myid,numprocs);MP
19、I_Finalize();更新的更新的Hello World(Fortran)program maininclude mpif.hinteger ierr,myid,numprocscall 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,numprocscall MPI_FINALIZE(ierr)End运行结果运行结果 mpicc o hello1 hello1.cmpicc o hell
20、o1 hello1.c mpirun-np 4 hello1mpirun-np 4 hello1结果:结果:I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4有消息传递有消息传递greetings(C语言语言)#include#include mpi.h”main(int argc,char*argv)int myid,numprocs,soure;MPI_Status status;char message100;MPI_Init(&argc,&argv);MPI_Common_rank(MPI_COMMON_WORLD,&myid);MPI_Co
21、mmon_size(MPI_COMMON_WORLD,&numprocs);有消息传递有消息传递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=32767 (0,UB),UB:MPI_TAG_UB=32767 Communicator:Communicator:缺省缺省MPI_COMM_WORLDMPI_COMM_WORLD Group
22、:Group:有限有限/N/N,有序,有序/Rank 0,1,2,N-1/Rank 0,1,2,N-1 Contex:Super_tag Contex:Super_tag,用于标识该通讯空间,用于标识该通讯空间为什么使用消息标签为什么使用消息标签(Tag)?未使用标签使用了标签为了说明为什么要用标签为了说明为什么要用标签,我们我们先来看右面一段没有使用标签先来看右面一段没有使用标签的代码的代码:这这段段代代码码打打算算传传送送A的的前前32个个字字节节进进入入X,传传送送B的的前前16个个字字节节进进入入Y.但但是是,如如果果消消息息B尽尽管管后后发发送送但但先先到到达达进进程程Q,就就会会被
23、被第第 一一 个个recv()接接 收收 在在X 中中.使用标签可以避免这个错误使用标签可以避免这个错误.在消息传递中使用标签在消息传递中使用标签使用标签的另一个原因是可使用标签的另一个原因是可以简化对下列情形的处理:以简化对下列情形的处理:假定有两个客户进程假定有两个客户进程P和和R,每个发送一个服务请求消息每个发送一个服务请求消息给服务进程给服务进程Q.消息匹配消息匹配接收接收buffer必须至少可以容纳必须至少可以容纳count个由个由datatype参数指明类型的数据参数指明类型的数据.如果接收如果接收buf太小太小,将导致溢出、出错将导致溢出、出错消息匹配消息匹配 参数匹配参数匹配d
24、est,tag,comm/source,tag,commdest,tag,comm/source,tag,comm Source=MPI_ANY_SOURCESource=MPI_ANY_SOURCE:接收任意处理器来的数据:接收任意处理器来的数据(任意消息来源任意消息来源).).Tag=MPI_ANY_TAGTag=MPI_ANY_TAG:匹配任意:匹配任意tagtag值的消息值的消息(任意任意tagtag消息消息)在阻塞式消息传送中不允许在阻塞式消息传送中不允许Source=Dest,否则会导致死锁否则会导致死锁消息传送被限制在同一个消息传送被限制在同一个communicator.在在se
25、ndsend函数中必须指定唯一的接收者函数中必须指定唯一的接收者statusstatus参数参数当使用当使用MPI_ANY_SOURCE或或/和和MPI_ANY_TAG接收消息时接收消息时如何确定消息的来源如何确定消息的来源source 和和tag值?值?在在C C中中,status.MPI_SOURCE,status.MPI_TAG.,status.MPI_SOURCE,status.MPI_TAG.在在FortranFortran中中,source=status(MPI_SOURCE),tag=status(MPI_TAG).source=status(MPI_SOURCE),tag=st
26、atus(MPI_TAG).Status还可用于返回实际接收到消息的长度还可用于返回实际接收到消息的长度 int MPI_Get_count(MPI_Status status,MPI_Datatypeint MPI_Get_count(MPI_Status status,MPI_Datatype datatype,int*count)datatype,int*count)IN status IN status 接收操作的返回值接收操作的返回值.IN datatype IN datatype 接收缓冲区中元素的数据类型接收缓冲区中元素的数据类型 OUT count OUT count 接收消息
27、中的元素个数接收消息中的元素个数 分析分析greetings#include#include mpi.h”main(int argc,char*argv)int numprocs;/*进程数,该变量为各处理器中的同名变量,存储是分布的*/int myid;/*进程ID,存储也是分布的 */MPI_Status status;/*消息接收状态变量,存储也是分布的 */char message100;/*消息buffer,存储也是分布的 */*初始化MPI*/MPI_Init(&argc,&argv);/*该函数被各进程各调用一次,得到自己的进程rank值*/MPI_Common_rank(MPI
28、_COMMON_WORLD,&myid);/*该函数被各进程各调用一次,得到进程数*/MPI_Common_size(MPI_COMMON_WORLD,&numprocs);分析分析greetings if(myid!=0)/*建立消息*/sprintf(message,Greetings from process%d!,myid);/*发送长度取strlen(message)+1,使0也一同发送出去*/MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);else/*myrank=0*/for(source=1;so
29、urce numprocs;source+)MPI_Recv(message,100,MPI_CHAR,source,99,MPI_COMM_WORLD,&status);printf(%sn,message);/*关闭MPI,标志并行代码段的结束*/MPI_Finalize();/*end main*/Greetings执行过程进程进程进程进程 0 0 0 0rank=0rank=0rank=0rank=0进程进程进程进程 1 1 1 1rank=1rank=1rank=1rank=1进程进程进程进程 2 2 2 2rank=2rank=2rank=2rank=2假设进程数为假设进程数为假设
30、进程数为假设进程数为3 3 3 3?问题:进程问题:进程问题:进程问题:进程1 1 1 1和进程和进程和进程和进程2 2 2 2谁先向进程谁先向进程谁先向进程谁先向进程0 0 0 0发送消息?发送消息?发送消息?发送消息?运行Greetingsmpirun-np 4 greeting 结果结果:Greetings from process 1!Greetings from process 1!Greetings from process 2!Greetings from process 2!Greetings from process 3!Greetings from process 3!提提
31、 纲纲引言引言基本基本MPIMPI编程编程MPIMPI高级编程简介高级编程简介实例实例提提 纲纲引言引言基本基本MPIMPI编程编程MPIMPI高级编程简介高级编程简介实例实例实例分析:求实例分析:求pi串行代码串行代码并行代码并行代码#include#include#includelongn,/*numberofslices*/i;/*slicecounter*/doublesum,/*runningsum*/pi,/*approximatevalueofpi*/mypi,x,/*independentvar.*/h;/*baseofslice*/intgroup_size,my_rank;
32、main(argc,argv)intargc;char*argv;intgroup_size,my_rank;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);MPI_Comm_size(MPI_COMM_WORLD,&group_size);n=2000;/*Broadcastntoallothernodes*/MPI_Bcast(&n,1,MPI_LONG,0,MPI_COMM_WORLD);h=1.0/(double)n;sum=0.0;for(i=my_rank+1;i=n;i+=
33、group_size)x=h*(i-0.5);sum=sum+4.0/(1.0+x*x);mypi=h*sum;/*Globalsum*/MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);if(my_rank=0)/*Node0handlesoutput*/printf(piisapproximately:%.16lfn,pi);MPI_Finalize();参考资料参考资料Kai Hwang,Zhiwei Xu,可扩展并行计算:技术、结构与编程Michael J.Quinn,MPI与OpenMP并行程序设计陈国良,中国科技大学,并行计算结构、算法和编程都志辉,清华大学,MPI并行程序设计迟学斌,中科院网络中心,高性能并行计算课程讲义张林波,中科院计算数学所,并行计算课程讲义安虹,中科大计算机系,并行计算课程讲义曹振南,曙光公司,MPI并行程序设计讲义谢谢,欢迎提问和讨论!谢谢,欢迎提问和讨论!此课件下载可自行编辑修改,仅供参考!此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢感谢您的支持,我们努力做得更好!谢谢
限制150内