mpi分布内存并行程序开发-2.ppt

上传人:小** 文档编号:89363081 上传时间:2019-05-24 格式:PPT 页数:63 大小:246.01KB
返回 下载 相关 举报
mpi分布内存并行程序开发-2.ppt_第1页
第1页 / 共63页
mpi分布内存并行程序开发-2.ppt_第2页
第2页 / 共63页
mpi分布内存并行程序开发-2.ppt_第3页
第3页 / 共63页
mpi分布内存并行程序开发-2.ppt_第4页
第4页 / 共63页
mpi分布内存并行程序开发-2.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《mpi分布内存并行程序开发-2.ppt》由会员分享,可在线阅读,更多相关《mpi分布内存并行程序开发-2.ppt(63页珍藏版)》请在金锄头文库上搜索。

1、MPI分布内存并行 程序开发,第四章 点对点通信函数,传送机制(两种): 阻塞方式,它必须等到消息从本地送出之后才可以执行后续的语句,保证了缓冲区等资源的可再用性; 非阻塞方式,它不须等到消息从本地送出就可以执行后续的语句,但非阻塞调用的返回并不保证资源的可再用性。,阻塞通信正确返回后,其后果是: - 该调用要求的通信操作已正确完成 - 该调用的缓冲区可用 消息信封要匹配 接收到的消息是最早发送的 非阻塞通信主要用于计算和通信的重叠,从而提高整个程序执行的效率。,MPI点对点通信函数的参数格式一般如下所示:,MPI消息传递函数参数,请求(request),这个参数用于非阻塞发送和非阻塞接收操作

2、。由于非阻塞操作返回后,数据可能继续存在缓冲中,由此需要一种机制来检测资源是否可用。根据该变量调用其它函数完成消息的实际发送和接收。在C程序中,这个参数是指向MPI_Request结构的指针。,通讯模式(4种):,标准通信模式(MPI_SEND) 缓存通信模式(MPI_BSEND) 同步通信模式(MPI_SSEND) 就绪通信模式(MPI_RSEND),标准(standard)模式:对数据的缓冲由具体MPI实现决定,与用户程序无关; 发送操作的正确返回而不要求接收操作收到发送的数据。,S,R,1,缓冲区(buffered)模式:用户定义,使用和回收缓冲区,不管接收操作是否启动,发送操作都可以执

3、行,但是必须保证缓冲区可用。,S,R,1,缓冲区,2,同步(synchronous)模式:开始不依赖于接收进程相应的操作是否启动,但必须等到接受开始启动发送才可以返回,S,R,1 2 3,就绪(ready)模式:只有当接收操作已经启动时,才可以在发送进程启动发送操作,否则发送将出错。,S,R,1 2,例3、死锁的发送接收序列,CALL MPI_COMM_RANK(comm,rank,ierr) IF (rank.EQ.0) THEN CALL MPI_RECV(recvbuf,count,MPI_REAL,1, tag,comm,status,ierr) CALL MPI_SEND(sendb

4、uf,count,MPI_REAL,1, tag,comm,ierr) ELSE IF (rank.EQ.1) CALL MPI_RECV(recvbuf,count,MPI_REAL,0, tag,comm,status,ierr) CALL MPI_SEND(sendbuf,count,MPI_REAL,0, tag,comm,ierr) ENDIF,进程 0,进程1,从进程1接收消息A,向进程1发送消息C,从进程0接收消息B,向进程0发送消息D,A,B,C,D,例4、不安全的发送接收序列,CALL MPI_COMM_RANK(comm,rank,ierr) IF (rank.EQ.0)

5、THEN CALL MPI_SEND(sendbuf,count,MPI_REAL,1, tag,comm,ierr) CALL MPI_RECV(recvbuf,count,MPI_REAL,1, tag,comm,status,ierr) ELSE IF (rank.EQ.1) CALL MPI_SEND(sendbuf,count,MPI_REAL,0, tag,comm,ierr) CALL MPI_RECV(recvbuf,count,MPI_REAL,0, tag,comm,status,ierr) ENDIF,进程 0,进程1,从进程1发送消息A,向进程1接收消息C,从进程0发送

6、消息B,向进程0接收消息D,A,B,C,D,系统缓冲区,程序5、安全的发送接收序列,CALL MPI_COMM_RANK(comm,rank,ierr) IF (rank.EQ.0) THEN CALL MPI_SEND(sendbuf,count,MPI_REAL,1, tag,comm,ierr) CALL MPI_RECV(recvbuf,count,MPI_REAL,1, tag,comm,status,ierr) ELSE IF (rank.EQ.1) CALL MPI_RECV(recvbuf,count,MPI_REAL,0, tag,comm,status,ierr) CALL

7、 MPI_SEND(sendbuf,count,MPI_REAL,0, tag,comm,ierr) ENDIF,进程 0,进程1,从进程1发送消息A,向进程1接收消息C,从进程0接收消息B,向进程0发送消息D,A,B,C,D,例子6,clock=(myrank+1)%groupsize; anticlock=(myrank+groupsize-1)%groupsize; MPI_Send(buf1,LENGTH,MPI_CHAR,clock,tag,MPI_COMM_WORLD); MPI_Recv(buf2,LENGTH,MPI_CHAR,anticlock,tag,MPI_COMM_WO

8、RLD,0,1,2,改进:,MPI_Isend(buf1,LENGTH,MPI_CHAR,clock,tag,MPI_COMM_WORLD,第五章 集合通信函数,集合通信是包含在通信因子中的所有进程都 参加操作。 集合通信一般实现三个功能 通信:组内数据的传输 同步:组内所有进程在特定的地点在执行 进度上取得一致 计算:对给定的数据完成一定的操作,集合操作的三种类型: 同步(barrier):集合中所有进程都到达后,每个进程再接着运行; 数据传递:广播(broadcast)、分散(scatter)、收集(gather)、全部到全部(alltoall); 规约(reduction):集合中的其中

9、一个进程收集所有进程的数据并计算(如:求最大值、求最小值、加、乘等);,集合通信函数,MPI_Barrier MPI_Bcast MPI_Scatter MPI_Gather MPI_Scan MPI_Reduce,MPI_Barrier(),在组中建立一个同步栅栏。当每个进程都到达MPI_Barrier调用后,程序才接着往下执行: MPI_Barrier (comm),程序7、同步示例,#include “mpi.h” #include “test.h” #include #include int main(int argc,char * * argv) int rank,size,I; i

10、nt *table; int errors=0; MPI_Aint address; MPI_Datatype type,newtype; int lens; MPI_Init( ,/*Make data table */ table =(int *)calloc(size,sizeof(int); tablerank=rank+1; /*准备要广播的数据*/ MPI_Barrier (MPI_COMM_WORLD); /*将数据广播出去*/ for (i=0;isize,i+) MPI_Bcast( ,MPI_Bcast(),从指定的一个根进程中把数据广播发送给组中的所有其它进程: MPI_

11、Bcast (*buffer,count,datatype,root,comm) 对于root进程:buffer既是接收缓冲又是发送缓冲;对于其他进程:buffer就是接收缓冲。,程序8、广播程序示例,#include #include “mpi.h” int main (argc,argv) int argc; Char * * argv; int rank,value; MPI_Init(,do if (rank=0) /*进程0读入需要广播的数据*/ scanf(“%d”, ,MPI_Scatter(),把根进程中的数据分散发送给组中的所有进程(包括自己): MPI_Scatter (*

12、sendbuf,sendcnt,sendtype, *recvbuf, recvcnt,recvtype,root,comm) root用MPI_Send(sendbuf, sendcountn, sendtype, )发送一个消息。这个消息分成n个相等的段,第i个段发送到进程组的第i个进程,sendcnt必须要和recvcnt相同。,MPI_Gather(),在组中指定一个进程收集组中所有进程发送来的消息,这个函数操作与MPI_Scatter函数操作相反: MPI_Gather (*sendbuf,sendcnt,sendtype, *recvbuf, ecvcount,recvtype,r

13、oot,comm),MPI_Reduce(),在组内所有的进程中,执行一个规约操作,并把结果存放在指定的一个进程中: MPI_Reduce (*sendbuf,*recvbuf,count,datatype, op,root, comm) MPI缺省定义了如下的规约操作,用户可根据自己的需要用MPI_Op_create函数创建新的规约操作:,程序9、规约示例,#include “mpi.h” #include #include double f(double x);/*定义函数f(x) */ return(4.0/(1.0+x*x); int main (int argc,char * arg

14、v) int done =0,n,myid,numprocs,i; double PI25DT=3.141592653589793238462643; double mypi,pi,h,sum,x; double startwtime=0.0,endwtime; int namelen; char processor_nameMPI_MAXPROCESSOR_NAME;,MPI_Init(,h=1.0/(double) n; sum=0.0; for(i=myid+1;i=n;i+=numprocs) /* 每一个进程计算一部分矩形的面积,若进程总数numprocs为4, 将 0-1区间划分为

15、100个矩形,则各个进程分别计算矩形块 0进程 1,5,9,13,97 1进程 2,6,10,14,98 2进程 3,7,11,15,99 3进程 4,8,12,16,100 */ x=h*(double)i-0.5); sum+=f(x); mypi=h*sum; /*各进程并行计算得到的部分和*/,/*将部分和累加得到所有矩形的面积,该面积和即为近似PI值*/ MPI_Reduce( ,MPI_Scan(),用来对分布在进程组上的数据执行前缀归约: MPI_Scan (*sendbuf,*recvbuf,count, datatype,op,comm),进程数据缓冲区的变化情况,群集函数的

16、特点:,通讯因子中所有进程都要调用 除了MPI_Barrier(),其他函数使用类似标准阻塞的通信模式。一个进程一旦结束了它所参与的群集操作就从群集例程中返回,并不保证其他进程执行该群集例程已经完成。 一个群集例程是不是同步操作取决于实现。,MPI并行程序的两种基本模式,对等模式的MPI程序设计 主从模式的MPI程序设计,一.对等模式的MPI程序设计,1.问题描述Jacobi迭代 Jacobi迭代是一种比较常见的迭代方法,其核心部分可以用程序1来表示。简单的说,Jacobi迭代得到的新值是原来旧值点相邻数值点的平均。 Jacobi迭代的局部性很好,可以取得很高的并行性。将参加迭代的数据按块分割后,各块之间除了

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号