MPI并行程序设计.pptx

上传人:s****8 文档编号:82775583 上传时间:2023-03-26 格式:PPTX 页数:39 大小:241.41KB
返回 下载 相关 举报
MPI并行程序设计.pptx_第1页
第1页 / 共39页
MPI并行程序设计.pptx_第2页
第2页 / 共39页
点击查看更多>>
资源描述

《MPI并行程序设计.pptx》由会员分享,可在线阅读,更多相关《MPI并行程序设计.pptx(39页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、MPI并行程序设计并行算法与并行程序设计消息传递编程基础消息传递模型的特征多线程化由多个进程组成,每个进程有自己的控制线程,可执行不同代码,支持控制并行(MPMD)和数据并行(SPMD)。异步并行性各进程异步执行,使用专用操作如路障、锁定通信等专用操作对进程加以同步。分离的地址空间各进程留驻在不同的地址空间,一个进程中的数据对另一个进程是不可见的,进程间通过执行专用的消息传递操作实现交互。显式交互程序员负责解决所有的交互问题,包括数据映射、通信、同步和聚集。显式分配工作负载和数据均需用户用显式方法分配给进程。消息传递编程基础编程工具的选择专用并行编程语言如occam语言对现有语言扩展语法来处理

2、消息传递如CC+语言、Fortran M语言专门的并行编译器不适用于消息传递机制使用现有语言,配备消息传递外部过程库如PVM、MPI。必须提供至少两类基本方法:1、创建分离进程以使它们能在不同的计算机上运行的方法;2、发送和接收消息的方法。消息传递编程基础进程的创建静态创建所有进程在执行前必须加以指定,系统将执行固定数目的进程。程序员通常需在进程或程序执行之前用命令行显式标识它们。通常有一个主进程(控制进程),其余的为从进程(工作进程)。SPMD模型将所有的进程融合到一个程序中,由控制语句选择不同的执行部分。SPMD是MPI所采用的主要方法消息传递编程基础进程的创建动态创建可在其他进程的执行期

3、间创建进程并启动执行它们,也可以撤销它们。在执行过程中进程数可以发生变化。动态进程创建功能更为强大,但在创建进程时也会导致显著的开销。动态进程创建最通用的模型是MPMD模型。通常采用主从方法,由一个处理器执行主程序(主进程),而其余进程在主进程中启动。消息传递编程基础消息传递方式同步消息传递消息传递过程结束后调用才返回的传递方式。同步消息传递不需要消息缓冲存储器。同步发送和接收操作过程中通常需要某种形式的同步信号。P同步发送同步发送M到到Q,等待,等待Q同步从同步从P接收接收S,直到消息,直到消息M已被发送和接收,已被发送和接收,发送和接收调用才返回,这时发送和接收调用才返回,这时X被赋值为被

4、赋值为11。进程进程PM=10;send M to Q;M=20;进程进程QS=-100;receive S from P;X=S+1;使用三路协议的同步使用三路协议的同步send和和recv调用调用send();recv();进程进程1进程进程2请求发送,唤醒进程请求发送,唤醒进程2确认确认开始发送开始发送进程进程2挂起挂起recv在在send之前调用之前调用send();recv();进程进程1进程进程2请求发送,进程请求发送,进程1挂起挂起确认,唤醒进程确认,唤醒进程1开始消息发送过程开始消息发送过程send在在recv之前调用之前调用消息传递编程基础消息传递方式锁定消息传递使用消息缓冲

5、区并在本地操作完成后就返回例程称为锁定的,或本地锁定的。消息缓冲区用来保存在recv接收之前发送的消息。发送例程当本地操作结束,消息已经安全上路,就可以继续执行后继工作。接收例程需要消息时,从缓冲区中获得消息。若消息缓冲区是空的,接收例程进入等待状态。当缓冲区已满时,发送例程将进入等待状态。进程进程PM=10;send M to Q;M=20;进程进程QS=-100;receive S from P;X=S+1;在锁定发送在锁定发送/接收方式下:接收方式下:当当P发送发送M到到Q,消息离开,消息离开M时,调用即返回,此时消息可能还未时,调用即返回,此时消息可能还未到达到达Q,而是暂时缓冲在网络

6、中的某处,或者已经到达接收结点,而是暂时缓冲在网络中的某处,或者已经到达接收结点的缓冲区。的缓冲区。当当Q准备从准备从P接收消息到接收消息到S中时,如果缓冲中已经有消息,不用等中时,如果缓冲中已经有消息,不用等待相应的发送操作,就可执行锁定接收,然而在消息未被接收前,待相应的发送操作,就可执行锁定接收,然而在消息未被接收前,它不能返回。它不能返回。X将被赋值为将被赋值为11。消息传递编程基础消息传递方式非锁定消息传递进程不必等相应接收,立即返回的例程称为非锁定的。进程执行非锁定发送/接收,非锁定发送/接收在告知系统发送/接收请求之后,便立即返回,此时消息并不一定已发出/接收。非锁定的消息传递需

7、由程序员保证用于传送的数据在传送之前不能被后继的语句所修改。进程进程PM=10;send M to Q;执行某些不会改变执行某些不会改变Q的计算的计算wait for M to be sentM=20;进程进程QS=-100;receive S from P;执行某些不会使用执行某些不会使用S的计算的计算wait for S to be receivedX=S+1;在非锁定发送在非锁定发送/接收方式下:接收方式下:依赖于两个进程的速度,依赖于两个进程的速度,X可能被赋为可能被赋为11、21、-99。进程进程PM=10;send M to Q;M=20;进程进程QS=-100;receive S

8、 from P;X=S+1;消息传递编程基础消息传递方式三种方式的比较同步方式表述清晰且易用,不需设置额外的数据缓冲区,但可能导致某些周期的浪费。在几乎所有的现行消息传递系统中,都使用锁定和非锁定方式,且需要足够的临时缓冲区空间。非锁定方式可使等待时间减到最小,但可能需要利用等待操作进行协调。额外缓冲区和等待操作的使用可能抵销所带来的好处。消息传递编程基础消息传递方式群组消息传递广播(broadcast)向所有与求解问题有关的进程发送相同的信息。散播(scatter)根进程的数据数组中的每个元素分别发送给各个进程。汇集(gather)一个进程从一组进程中的每一个进程处收集一个数据。汇集是散播的

9、逆操作。有时汇集操作与一个计算操作组合在一起,对各个值进行汇总,称为归约(reduce)操作消息传递编程基础消息选择源进程和目的进程标记在发送和接收例程中须指定目的进程和源进程。可以使用特殊符号或数字作为通配源地址,即允许接收来自任何源进程的消息。XXXX 收收消息传递编程基础消息选择消息标记(Message Tag)由用户选定的正整数,对不同类型的消息进行区分,附于消息之上,用于消息的选择。进程进程P:send(A,double,Q)send(B,int,Q)进程进程Q:recv(X,P,double)recv(Y,P,int)进程进程P:send(A,double,Q,tag1)send(

10、B,int,Q,tag2)进程进程Q:recv(X,P,tag1,double)recv(Y,P,tag2,int)XXXX 收收MPI并行程序设计MPI程序的一般模式#include int main(int argc,char*argv)int size,rank;MPI_Init(&argc,&argv);/*initialize MPI*/MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD,&rank);if(rank=0)master();else slave();MPI_Finalize();/*clea

11、nup MPI*/return 0;#include int main(int argc,char*argv)int size,rank;MPI_Init(&argc,&argv);/*initialize MPI*/MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD,&rank);switch(rank)case 0:.case 1:.default:.MPI_Finalize();/*cleanup MPI*/return 0;#include“mpi.h”int foo(int i).int main(int

12、argc,char*argv)int i,tmp,sum=0,group_size,my_rank,N;MPI_Status status;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&group_size);MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);if(my_rank=0)printf(“N=“);scanf(“%d”,&N);for(i=1;igroup_size;i+)S1:MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD;);for(i=my_rank;iN;

13、i+=group_size)sum+=foo(i);for(i=1;igroup_size;i+)S2:MPI_Recv(&tmp,1,MPI_INT,i,i,MPI_COMM_WORLD,&status);sum+=tmp;printf(“nThe result=%dn”,sum);elseS3:MPI_Recv(&N,1,MPI_INT,0,my_rank,MPI_COMM_WORLD,&status);for(i=my_rank;iN;i+=group_size)sum+=foo(i);S4:MPI_Send(&sum,1,MPI_INT,0,i,MPI_COMM_WORLD);MPI_

14、Finalize();return 0;#include#include#define N 1000000main()double sum=0,local,mypi,pi,dx;long i,taskid,numtask;A:dx=1.0/N;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&taskid);MPI_COMM_size(MPI_COMM_WORLD,&numtask);B:for(i=taskid;iN;i+=numtask)P:local=(i+0.5)*dx;Q:sum+=4.0/(1.0+local*local);my

15、pi=sum*dx;C:MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);D:if(taskid=0)printf(“pi is%lfn”,pi);MPI_Finalize();#include#include using namespace std;int main(int argc,char*argv)int size,rank,x=-1;MPI_Status status;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MP

16、I_COMM_WORLD,&rank);while(x!=0)if(rank=0)cout x;cout Read x from rank rank endl;elseMPI_Recv(&x,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,&status);cout Recevied x from rank rank-1 endl;if(ranksize-1)MPI_Send(&x,1,MPI_INT,rank+1,0,MPI_COMM_WORLD);cout Send x to rank rank+1 endl;MPI_Barrier(MPI_COMM_WORLD);MP

17、I_Finalize();return 0;MPI的通信模式分分类发送送接收接收阻塞通信MPI_SendMPI_RecvMPI_IrecvMPI_BsendMPI_RsendMPI_Ssend非阻塞通信MPI_IsendMPI_IbsendMPI_IrsendMPI_IssendB:Buffer R:Ready S:SynchonousI:Immediately#include#include using namespace std;int main(int argc,char*argv)int rank;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM

18、_WORLD,&rank);char msg17,msg317;double msg22;int s1,s2,s3;MPI_Status status;MPI_Pack_size(7,MPI_CHAR,MPI_COMM_WORLD,&s1);MPI_Pack_size(2,MPI_DOUBLE,MPI_COMM_WORLD,&s2);MPI_Pack_size(17,MPI_CHAR,MPI_COMM_WORLD,&s3);int bufsize=3*MPI_BSEND_OVERHEAD+s1+s2+s3;char*buf=new charbufsize;MPI_Buffer_attach(b

19、uf,bufsize);if(rank=0)MPI_Bsend(msg1,7,MPI_CHAR,1,0,MPI_COMM_WORLD);MPI_Bsend(msg2,2,MPI_DOUBLE,1,0,MPI_COMM_WORLD);MPI_Bsend(msg3,17,MPI_CHAR,1,0,MPI_COMM_WORLD);else if(rank=1)MPI_Recv(msg1,7,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);MPI_Recv(msg2,2,MPI_DOUBLE,0,0,MPI_COMM_WORLD,&status);MPI_Recv(msg3,

20、17,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);MPI_Buffer_detach(&buf,&bufsize);delete buf;MPI_Finalize();return 0;缓冲模式if(rank=0)MPI_Recv(buffer,n,MPI_INT,1,1,MPI_COMM_WORLD,&status);MPI_Barrier(MPI_COMM_WORLD);else if(rank=1)MPI_Barrier(MPI_COMM_WORLD);MPI_Rsend(buffer,n,MPI_INT,0,1,MPI_COMM_WORLD);就绪模式MP

21、I中的通信安全问题例程:rank传递01230123#include main(int argc,char*argv)int rank,size,x;MPI_Status status;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Send(&rank,1,MPI_INT,(rank+1)%size,1,MPI_COMM_WORLD);MPI_Recv(&x,1,MPI_INT,(rank+size-1)%size,1,MPI_COMM_WORL

22、D,&status);MPI_Finalize();return 0;MPI中的通信安全问题MPI中的通信安全问题MPI中的通信安全问题MPI中的通信安全问题例程:避免死锁的rank传递#include main(int argc,char*argv).if(rank%2=0)MPI_Send(&rank,1,MPI_INT,(rank+1)%size,1,MPI_COMM_WORLD);MPI_Recv(&x,1,MPI_INT,(rank+size-1)%size,1,MPI_COMM_WORLD,&status);else MPI_Recv(&x,1,MPI_INT,(rank+size

23、-1)%size,1,MPI_COMM_WORLD,&status);MPI_Send(&rank,1,MPI_INT,(rank+1)%size,1,MPI_COMM_WORLD);MPI_Finalize();return 0;MPI中的通信安全问题捆绑接收发送:MPI_Sendrecvint MPI_Sendrecv(void*sendbuf,int sendcount,MPI_Datatype sendtype,int dest,int sendtag,void*recvbuf,int recvcount,MPI_Datatype recvtype,int source,int rec

24、vtag,MPI_Comm comm,MPI_Status*status)MPI的数据类型MPI的数据类型是用于保障消息传递过程中的数据能够被正确的解释,而不是为了用于计算。消息传递中的类型匹配有类型数据的通信,发送方和接收方均使用相同的数据类型无类型数据的通信,发送方和接收方均以MPI_BYTE作为数据类型打包数据的通信,发送方和接收方均使用MPI_PACKED常见问题和错误引用argc和argv;在MPI_Init之前和MPI_Finalize之后写可执行代码;用MPI_Recv和MPI_Bcast匹配;不合理的MPI_Send和MPI_Recv次序;发送和接收时的数据类型不匹配;接收缓冲

25、区的溢出;没有正确配置各运行结点;执行程序没有正确地部署或更新;MPI实践练习MPI程序的编译和运行#include#include using namespace std;int main(int argc,char*argv)int size,rank;char ProcessNameMPI_MAX_PROCESSOR_NAME;int processlen;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Get_processor_name(

26、ProcessName,&processlen);cout Hello,World!Size is size ,My rank is rank ,Process name is ProcessName endl;MPI_Finalize();return 0;MPI实践练习X的传送由0进程从用户输入读取X;0n-2进程将X发送到下一个进程;1n-1进程从前一个进程获得X;MPI实践练习循环传送rank进程i从进程i-1获得其rank值,并将自己的rank传送给i+1进程;进程n-1将自己的rank传送给0进程;进程0从进程n-1获得其rank值;MPI实践练习的计算利用公式计算MPI实践练习一阶线性递推公式计算MPI实践练习for all Pk k=1N doPk=ak;Qk=bk;for(L=1;L=1)Ck=Pk*Qk-L+Qk;Qk=Ck;Ck=Pk*Pk-L;Pk=Ck;MPI实践练习区间分割法解代数方程luMPI实践练习while|u-l|e dod=(u-l)/(n+1);for all Pi i=1n doyi=f(l+i*d);i=0;while(yi与与yi+1同号同号)l+=d;i+;u=l+d;yn+1=yi+1;z=(l+u)/2;

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

当前位置:首页 > 生活休闲 > 生活常识

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com