版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
三月231/55并行程序设计简介三月232/55讲座内容提示基本概念基本的MPI点到点通信(Pointtopoint)MPI中API的主要内容,为MPI最基本,最重要的内容MPI程序的编译和运行实例三月233/55参考文献MPI--thecompletereference.MarcSnir,MITPress,1998.ISBN0262692155,0262692163.UsingMPI:portableparallelprogrammingwiththemessage-passinginterface,WilliamGropp,MITPress,1999.2ndedition.ISBN0262571323.UsingMPI-2:advancedfeaturesofthemessage-passinginterface.WilliamGropp,MITPress,1999.ISBN0262571331.高性能计算并行编程技术-MPI并行程序设计,都志辉,清华大学出版社,2001年8月。三月235/55消息传递并行程序设计消息传递并行程序设计指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。并行计算粒度大,特别适合于大规模可扩展并行算法由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式三月236/55什么是MPI?MassagePassingInterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准三月237/55MPI的发展过程发展的两个阶段MPI1.1:1995MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.MPI1.2~2.0:动态进程,并行I/O,远程存储访问、支持F90和C++(1997).三月239/55:从简单入手
—Init和Finalize下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序Hello(下页).该程序在终端打印出HelloWorld!字样.“HelloWorld”:一声来自新生儿的问候.三月2310/55Helloworld(C)#include<stdio.h>#include"mpi.h“main( intargc, char*argv[]){
MPI_Init(&argc,&argv);printf("Hello,world!\n");
MPI_Finalize();}三月2311/55Helloworld(Fortran)programmaininclude‘mpif.h’integerierrcallMPI_INIT(ierr)print*,'Hello,world!'callMPI_FINALIZE(ierr)end三月2313/55MPI初始化-MPI_INITintMPI_Init(int*argc,char**argv)MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数(除MPI_Initialized()外).要求main必须带参数运行,否则出错.三月2314/55MPI结束-MPI_FINALIZEintMPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程.之后串行代码仍可在主进程(rank=0)上运行(如果必须).三月2315/55MPI程序的的编译与运行mpif77hello.f或mpicchello.c默认生成a.out的可执行代码.mpif77–ohellohello.f或mpicc–ohellohello.c生成hello的可执行代码.mpirun–np4a.outmpirun–np4hello4指定np的实参,表示进程数,由用户指定.a.out/hello要运行的MPI并行程序.%小写onp:Thenumberofprocess.三月2317/55:Hello是如何被执行的?SPMD:SingleProgramMultipleData(SIMD)
::::#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}HelloWorld!HelloWorld!HelloWorld!HelloWorld!#include"mpi.h"#include<stdio.h>main(intargc,char*argv[]){MPI_Init(&argc,&argv);printf("Hello,world!\n");MPI_Finalize();}rsh\ssh三月2318/55:开始写MPI并行程序
—Comm_size和Comm_rank在写MPI程序时,我们常需要知道以下两个问题的答案:任务由多少个进程来进行并行计算?我是哪一个进程?
三月2319/55MPI提供了下列函数来回答这些问题:用MPI_Comm_size
获得进程个数pintMPI_Comm_size(MPI_Commcomm,int*size);用MPI_Comm_rank
获得进程的一个叫rank的值,该rank值为0到p-1间的整数,相当于进程的ID intMPI_Comm_rank(MPI_Commcomm,int*rank);三月2321/55更新的HelloWorld(F77)programmaininclude‘mpif.h’integerierr,myid,numprocscallMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)print*,‘Iam',myid,‘of',numprocscallMPI_FINALIZE(ierr)end三月2322/55:运行结果[dair@node01~]$mpicc–ohello1hello1.c[dair@node01~]$mpirun-np4hello1Iam0of4Iam1of4Iam2of4Iam3of4[dair@node01~]$计算机打印字符我们输入的命令三月2323/55:写MPI并行通信程序
--Send和RecvGreeting执行过程三月2325/55有消息传递greetings(c)if(myid!=0){ strcpy(message,"HelloWorld!");
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,&status);printf("%s\n",message);}}
MPI_Finalize();}/*endmain*/三月2326/55解剖greetings程序头文件:mpi.h/MPI_Init(int*argc,char***argv)启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数(除MPI_Initialize()外).要求main必须带参数运行,否则出错.通信域(通信空间):MPI_COMM_WORLD:一个通信空间是一个进程组和一个上下文的组合.上下文可看作为组的超级标签,用于区分不同的通信域.在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信域即被写作MPI_COMM_WORLD.该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.三月2329/55PointtoPoint通信单个进程对单个进程的通信,重要且复杂术语Blocking(阻塞):一个例程须等待操作完成才返回,返回后用户可以重新使用调用中所占用的资源.
Non-blocking(非阻塞):一个例程不必等待操作完成便可返回,但这并不意味着所占用的资源可被重用.
Local(本地):过程的完成仅依赖于本地正在执行的进程。Non-local(非本地):如果过程的完成要求其他进程的MPI过程完成。三月2330/55BlockingSendintMPI_Send(void*buf,intcount,MPI_Datatypedatatype,intdest,inttag,MPI_Commcomm);
INbuf 发送缓冲区的起始地址
INcount 要发送信息的元素个数
INdatatype发送信息的数据类型
INdest 目标进程的rank值
INtag 消息标签
INcomm 通信域三月2331/55BlockingReceiveintMPI_Recv(void*buf,intcount,MPI_Datatypedatatype,intsource,inttag,MPI_Commcomm,MPI_Status*status);
OUTbuf 发送缓冲区的起始地址
INcount 要发送信息的元素个数
INdatatype 发送信息的数据类型
INdest 目标进程的rank值
INtag 消息标签
INcomm 通信域
OUTstatus status对象,包含实际接收到的消息的有关信息三月2332/55MPI消息MPI消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容数据:<起始地址、数据个数、数据类型>信封:<源/目的、标识、通信域>三月2333/55三月2334/55消息数据由count个类型为datatype的连续数据空间组成,起始地址为buf不是以字节数,而是以元素的个数指定消息的长度count可以是零,这种情况下消息的数据部分是空的MPI基本数据类型相应于宿主语言的基本数据类型三月2335/55MPI基本数据类型三月2336/55MPI标识一条消息的信息包含四个域:Source:发送进程隐式确定,由进程的rank值唯一标识Destination:Send函数参数确定Tag:Send函数参数确定,用于识别不同的消息
(0,UB),UB:MPI_TAG_UB>=32767.Communicator:缺省MPI_COMM_WORLDGroup:有限/N,有序/Rank[0,1,2,…N-1]Contex:Super_tag,用于标识该通讯空间.消息信封三月2337/55status参数当使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息时如何确定消息的来源source和tag值呢?在C中,结构,status.MPI_SOURCE,status.MPI_TAG.在Fortran中,数组,source=status(MPI_SOURCE),tag=status(MPI_TAG).Status还可用于返回实际接收到消息的长度intMPI_Get_count(MPI_Statusstatus,MPI_Datatypedatatype,int*count)INstatus接收操作的返回值.INdatatype接收缓冲区中元素的数据类型.OUTcount接收消息中的元素个数.三月2338/55消息匹配接收buffer必须至少可以容纳count个由datatype参数指明类型的数据.如果接收buf太小,将导致溢出、出错.消息匹配参数匹配dest,tag,comm/source,tag,commSource==MPI_ANY_SOURCE:接收任意处理器来的数据(任意消息来源).Tag==MPI_ANY_TAG:匹配任意tag值的消息(任意tag消息).Source=destination是允许的,但是不安全的,可能导致死锁。消息传送被限制在同一个communicator.在send函数中必须指定唯一的接收者(Push/pull通讯机制).三月2339/55分析greetings#include<stdio.h>#include"mpi.h“main(intargc,char*argv[]){ intnumprocs;/*进程数,该变量为各处理器中的同名变量,存储是分布的 */ intmyid; /*我的进程ID,存储也是分布的 */ MPI_Statusstatus; /*消息接收状态变量,存储也是分布的 */
charmessage[100]; /*消息buffer,存储也是分布的 */
/*初始化MPI*/
MPI_Init(&argc,&argv);/*该函数被各进程各调用一次,得到自己的进程rank值*/
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
/*该函数被各进程各调用一次,得到进程数*/
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);三月2340/55分析greetingsif(myid!=0){
/*建立消息*/sprintf(message,"Greetingsfromprocess%d!",myid);
/*发送长度取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,&status);printf(“%s\n",message);}}
/*关闭MPI,标志并行代码段的结束*/
MPI_Finalize();}/*Endmain*/三月2341/55Greetings执行过程
假设进程数为3(进程0)(进程1)(进程2)(rank=0)(rank=1)(rank=2)..Recv();..Recv();.....Send();......Send()...问题:进程1和2谁先开始发送消息?谁先完成发送??%三月2342/55运行greetings[dair@node01~]$mpicc–ogreetinggreeting.c[dair@node01~]$mpirun-np4greetingGreetingsfromprocess1!Greetingsfromprocess2!Greetingsfromprocess3![dair@node01~]$计算机打印字符我们输入的命令三月2343/55最基本的MPIMPI调用借口的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的个数非常有限。上面介绍的是6个最基本的MPI函数。MPI_Init(…);MPI_Comm_size(…);MPI_Comm_rank(…);MPI_Send(…);MPI_Recv(…);MPI_Finalize();MPI_Init(…);…并行代码;…MPI_Fainalize();只能有串行代码;三月2344/55现在您已经能够用MPI进行并行编程了!三月2345/55实例分析:求PI三月2346/55串行代码h=1.0/(double)n;sum=0.0;for(i=1;i<=n;i++){ x=h*((double)i–0.5); sum+=f(x);}pi=h*sum;doublef(doublea){ return(4.0/(1.0+a*a));}三月2347/55并行代码h=1.0/(double)n;sum=0.0;for(i=myid+1;i<=n;i+=numprocs){ x=h*((double)i–0.5); sum+=f(x);}mypi=h*sum;MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);doublef(doublea){ return(4.0/(1.0+a*a));}三月2348/55cpi.c#include"mpi.h"#include<stdio.h>#include<math.h>doublef(double);doublef(doublea);{return(4.0/(1.0+a*a));}三月2349/55cpi.cintmain(intargc,char*argv[]){intdone=0,n,myid,numprocs,i;doublePI25DT=3.1493238462643;doublemypi,pi,h,sum,x;doublestartwtime=0.0,endwtime;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 零酒驾宣传标语(130句)
- 水的溶解中班教案5篇
- 平面设计个人工作计划(10篇)
- 网络销售开场白(3篇)
- 安徽省马鞍山市2023-2024学年高一上学期11月阶段检测 数学试题含答案
- DB12-T 1113-2021 河湖长制工作规范
- 山东省青岛市(2024年-2025年小学五年级语文)人教版随堂测试((上下)学期)试卷及答案
- 2024年PCM脉码调制终端设备项目资金需求报告代可行性研究报告
- 2024-2025学年重庆乌江新高考协作体高三上学期二调化学试题及答案
- 幼儿园教师信息化培训
- 金坛区苏科版四年级心理健康教育第1课《我的兴趣爱好》课件(定稿)
- 心肌缺血和心肌梗死的心电图表现讲义课件
- 小学生性教育调查问卷
- 学历案的编写课件
- 旅游行政管理第二章旅游行政管理体制课件
- 卫生院关于召开基本公共卫生服务项目培训会的通知
- 有机化学ppt课件(完整版)
- 管理咨询公司关键绩效考核指标
- 最新人教版三年级上册数学期中考试试题以及答案
- 《走进爱国主义教育基地》ppt
- 抖音IP孵化指南简约(PPT课件)
评论
0/150
提交评论