MPI并行程序设计.ppt

上传人:sh****n 文档编号:3381531 上传时间:2019-12-13 格式:PPT 页数:42 大小:248KB
返回 下载 相关 举报
MPI并行程序设计.ppt_第1页
第1页 / 共42页
MPI并行程序设计.ppt_第2页
第2页 / 共42页
MPI并行程序设计.ppt_第3页
第3页 / 共42页
点击查看更多>>
资源描述
2019/12/13,1,MPI并行程序设计,MPI是目前最重要的并行编程工具,它具有移植性好、功能强大、效率高等多种优点,而且有多种不同免费、高效、实用的实现版本,几乎所有的并行计算机厂商都提供对它的支持,这是其他的并行编程环境所无法比拟的。,2019/12/13,2,什么是MPI?,MPI(MessagePassingInterface)MPI是一个库,而不是一门语言;MPI是一种标准或规范的代表,而不特指某一个对它的具体实现;MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准;,2019/12/13,3,消息传递模型,假设底层的消息传递模型是一组处理器,每一个处理器有自己的本地内存,并且通过互连网络实现与其他处理器的消息传递,2019/12/13,4,MPI并行程序设计,MPI历史机房集群环境六个接口构成的MPI子集MPI并行程序的两种基本模式MPI并行程序的通信模式,2019/12/13,5,MPI的历史,MPI初稿:美国并行计算中心工作会议(92年4月)MPI-1公布:第一届MPI大会(93年2月)MPI标准正式发布:1994年5月MPI-1.1发布:1995年6月MPI-2发布:(以前的版本统称MPI-1)1997年7月,2019/12/13,6,MPI的实现,MPICH:最重要的MPI实现与MPI-1规范同步发展的版本支持部分MPI-2的特征(如动态生成进程等)LAM(LocalAreaMulticomputer)OhioStateUniversity开发它主要用于异构的计算机网络计算系统,2019/12/13,7,下载地址,MPICH2(最新版本1.0.3)http:/www-unix.mcs.anl.gov/mpi/mpich/LAM-MPI(最新版本7.1.2)http:/www.lam-mpi.org/download/,2019/12/13,8,机房环境,软件部分操作系统:WindowsServer2003MPI实现:MPICH-1.2.5硬件部分集群系统有4个刀片(每片主要参数):2CPU(Xeon3.2GHZ),2GBRAM,2(4)个千兆网卡,2个SCSI硬盘,2019/12/13,9,机房集群环境,一个主节点(一个刀片)启用双网卡,设置内/外网IP地址,用于用户登陆、提交调试程序、管理员管理集群等。主节点开启SSH、Ftp等服务。三个从节点用于从主节点接受计算任务并执行计算(返回结果)。从节点开启SSH服务。节点之间的通信通过SSH协议来实现,2019/12/13,10,六个接口构成的MPI子集,在MPI-1中,共有128个调用接口,在MPI-2中有287个,应该说MPI是比较庞大的。但是从理论上说,MPI所有的通信功能可以用它的6个基本的调用来实现,掌握了这6个调用,就可以实现所有的消息传递并行程序的功能。所有的MPI标识符,都以MPI前缀开头,后面紧跟一个大写字母和一系列小写字母以及下划线。MPI调用的参数说明IN:调用部分传递给MPI的参数,MPI除了使用该参数外不允许对这一参数做任何修改OUT:MPI返回给调用部分的结果参数,该参数的初始值对MPI没有任何意义INOUT:调用部分首先将该参数传递给MPI,MPI对这一参数引用、修改后,将结果返回给外部调用,该参数的初始值和返回结果都有意义,2019/12/13,11,、MPI初始化:MPI_Init函数用法:MPI_Init(inti,myid,numprocs;intnamelen;MPI_Statusstatus;charprocessor_nameMPI_MAX_PROCESSOR_NAME;MPI_Init(,2019/12/13,19,开启个进程运行结果:,2019/12/13,20,开启个进程运行结果:,2019/12/13,21,MPI并行程序的两种基本模式,两种最基本的并行程序设计模式:对等模式:各个部分地位相同,功能和代码基本一致,只不过是处理的数据或对象不同,也容易用同样的程序来实现。(典型应用如Jacobi迭代)主从模式:具有主进程和从进程,主进程接收从进程的处理结果,并进行汇总处理(典型应用如矩阵向量乘法),2019/12/13,22,对等模式并行jacobi程序,这里的jacobi迭代是计算一个矩阵的数据二维数组A(M,M)。其边界值边界赋为8,内部初值为0,通过迭代求矩阵各点的值.假设需要迭代的数据是M*M的二维数组A(M,M),令M=4*N,按上图进行数据划分,则分布在4个不同进程上的数据分别是:进程0:A(M,1:N);进程1:A(M,N+1:2*N);进程2:A(M,2*N+1:3*N);进程3:A(M,3*N+1:4*N).由于在迭代过程中,边界点新值的计算需要相邻边界其他块的数据,因此在每一个数据块的两侧各增加1列的数据空间,用于存放从相邻数据块通信得到的数据。每个数据块的大小就从M*N扩大到M*(N+2)。,2019/12/13,23,为了并行求解,这里将参加迭代的数据按列进行分割,假设有4个进程同时并行计算,数据的分割结果如图:,边界点新值的计算需要相邻边界其他块的数据,因此在每一个数据块的两侧各增加1列,2019/12/13,24,进程0,进程1,进程2,进程3,发送,发送,发送,发送,发送,发送,接收,接收,接收,接收,接收,接收,2019/12/13,25,例子:并行jacobi程序,programmainincludempif.hintegertotalsize,mysize,stepsParameter(totalsize=16)(定义全局数组的规模)parameter(mysize=totalsize/4,steps=10)integern,myid,numprocs,i,j,rcReala(totalsize,mysize+2),b(totalsize,mysize+2)Integerbegin_col,end_col,ierrIntegerstatus(MPI_STATUS_SIZE)callMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)print*,”Process”,myid,”of”,numprocs,”isalive”,迭代计算一个二维数组A(M,M),2019/12/13,26,(数组初始化)doj=1,mysize+2doi=1,totalsizea(i,j)=0.0enddoenddoIf(myid.eq.0)thendoi=1,totalsizea(i,2)=8.0enddoendifIf(myid.eq.3)thendoi=1,totalsizea(i,mysize+1)=8.0enddoendifdoi=1,mysize+2a(1,i)=8.0a(totalsize,i)=8.0enddo,2019/12/13,27,(Jacobi迭代部分)don=1,steps(从右侧的邻居得到数据)if(myid.lt.3)thencallMPI_RECV(a(1,mysize+2),totalsize,MPI_REAL,myid+1,10,MPI_COMM_WORLD,status,ierr)endif(向左侧的邻居发送数据)if(myid.gt.0)thencallMPI_SEND(a(1,2),totalsize,MPI_REAL,myid-1,10,MPI_COMM_WORLD,ierr)endif,2019/12/13,28,(向右侧的邻居发送数据)if(myid.lt.3)thencallMPI_SEND(a(1,mysize+1),totalsize,MPI_REAL,myid+1,10,MPI_COMM_WORLD,ierr)endif(从左侧的邻居接收数据)if(myid.gt.0)thencallMPI_RECV(a(1,1),totalsize,MPI_REAL,myid-1,10,MPI_COMM_WORLD,status,ierr)endifbegin_col=2end_col=mysize+1if(myid.eq.0)thenbegin_col=3endifif(myid.eq.3)thenend_col=mysizeendif,2019/12/13,29,doj=begin_col,end_coldoi=2,totalsize-1b(i,j)=0.25*(a(i,j+1)+a(i,j-1)+a(i+1,j)+a(i-1,j)enddoenddodoj=begin_col,end_coldoi=2,totalsize-1a(i,j)=b(i,j)enddoenddoenddodoi=2,totalsize-1print*,myid,(a(i,j),j=begin_col,end_col)enddocallMPI_FINALIZE(rc)end,2019/12/13,30,主从模式矩阵向量乘,对于矩阵C=A*B,主进程将向量B广播给所有的从进程,然后将矩阵A的各行依次发送给从进程。从进程计算一行和B相乘的结果然后将结果发送给主进程。主进程循环向各个从进程发送一行的数据直到将A各行的数据发送完毕。一旦主进程将A的各行发送完毕则每收到一个结果就向相应的从进程发送结束标志,从进程接收到结束标志后退出执行主进程收集完所有的结果后也结束。,2019/12/13,31,例子:矩阵向量乘,programmaininclude“mpif.h”integerMAX_ROWS,MAX_COLS,rows,colsparameter(MAX_ROWS=1000,MAX_COLS=1000)doubleprecisiona(MAX_ROWS,MAX_COLS),b(MAX_COLS),c(MAX_COLS)doublepresicionbuffer(MAX_COLS),ansintegermyid,master,numprocs,ierr,status(MPI_STATUS_SIZE)integeri,j,numsent,numrcvd,senderintegeranstype,row,计算矩阵,2019/12/13,32,callMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)master=0rows=100cols=100If(myid.eq.master)then(主进程对矩阵A和B赋初值)doi=1,colsb(i)=1doj=1,rowsa(i,j)=ienddoenddo,2019/12/13,33,numsent=0numrcvd=0(将矩阵B发送给所有其他的从进程,通过下面的广播语句实现)callMPI_BCAST(b,cols,MPI_DOUBLE_PRECISION,master,*MPI_COMM_WORLD,ierr)(依次将矩阵A的各行发送给其他的numprocs-1个从进程)doi=1,min(numprocs-1,rows)doj=1,cols(将一行的数据取出来依次放到缓冲区中)buffer(j)=a(i,j)enddo(将准备好的一行数据发送出去)callMPI_SEND(buffer,cols,MPI_DOUBLE_PRECISION,i,i,*MPI_COMM_WORLD,ierr)numsent=numsent+1enddo,2019/12/13,34,(对所有的行,依次接收从进程对一行数据的计算结果)doi=1,rowcallMPI_RECV(ans,1,MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE,*MPI_ANY_TAG,MPI_COMM_WORLD,status,ierr)sender=status(MPI_SOURCE)anstype=status(MPI_TAG)(将该行数据赋给结果数组C的相应单元)c(anstype)=ans(如果还有其他的行没有被计算,则继续发送)if(numsent.lt.rows)thendoj=1,cols(准备好新一行的数据)buffer(j)=a(numsent+1,j)enddo(将该行数据发送出去)callMPI_SEND(buffer,cols,MPI_DOUBLE_PRECISION,sender,*numsent+1,MPI_COMM_WORLD,ierr)numsent=numsent+1,2019/12/13,35,else(若所有行都已发送出去,则每接收一个消息则向相应的从进程发送一个标志为0的空消息,终止该从进程的执行)callMPI_SEND(1.0,0,MPI_DOUBLE_PRECISION,sender,0,*MPI_COMM_WORLD,ierr)endifenddoelse(下面为从进程的执行步骤,首先是接收数组B)callMPI_BCAST(b,cols,MPI_DOUBLE_PRECISION,master,*MPI_COMM_WORLD,ierr)(接收主进程发送过来的矩阵A一行的数据)callMPI_RECV(buffer,cols,MPI_DOUBLE_PRECISION,master,*MPI_ANY_TAG,MPI_COMM_WORLD,status,ierr),2019/12/13,36,(若接收到标志为0的消息,则退出执行)if(status(MPI_TAG).ne.0)thenrow=status(MPI_TAG)ans=0.0doI=1,colsans=ans+buffer(i)*b(j)enddo(计算一行的结果,并将结果发送给主进程)callMPI_SEND(ans,1,MPI_DOUBLE_PRECISION,master,row,MPI_COMM_WORLD,ierr)goto90endifendifcallMPI_FINALIZE(ierr)end,2019/12/13,37,MPI并行程序的通信模式,MPI的四种通信模式:标准通信模式(MPI_SEND)缓存通信模式(MPI_BSEND)同步通信模式(MPI_SSEND)就绪通信模式(MPI_RSEND),2019/12/13,38,、标准通信模式,在MPI采用标准通信模式,是否对发送的数据进行缓存是由MPI自身决定的对等模式和主从模式,绝大部分MPI的程序都是这两种模式之一或二者的组合MPI程序一般是SPMD程序,所有的MPMD程序都可以用SPMD程序来表达,2019/12/13,39,2、缓存通信模式,用户直接对通信缓冲区进行申请、使用和释放不管接收操作是否启动,发送操作都可以执行,但是在发送消息之前必须有缓冲区,这由用户保证消息发送能否进行及能否正确返回,不依赖于接收进程,完全依赖于是否有足够的通信缓冲区可用,2019/12/13,40,、同步通信模式,发送不依赖于接收进程相应的接收操作是否已经启动,但是同步发送却必须等到相应的接收进程开始后才可以正确返回同步发送返回后,发送缓冲区中的数据已经全部被系统缓冲区缓存并且已经开始发送,2019/12/13,41,4、就绪通信模式,只有当接收进程的接收操作已经启动时,才可以在发送进程启动发送操作对于非阻塞发送操作的正确返回,并不意味着发送已完成,但对于阻塞发送的正确返回,则发送缓冲区可以重复使用就绪通信模式的特殊之处就在于它要求接收操作先于发送操作而被启动,启动同步发送,接收操作启动,发送进程,接收进程,2019/12/13,42,Thanks!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!