您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文化 > 并行算法与并行程序设计第05章 MPI并行程序设计
MPI并行程序设计教师:彭四伟MPICH2的下载和安装官方下载地址:=downloads安装条件.NetFrame1.1/2.0VisualC++2005SP1RedistributablePackage(x86)管理员权限MPICH2服务(守护进程)MPICH2的守护进程smpd服务的安装Smpd-install服务的卸载Smpd-remove服务的开启Smpd-start服务的停止Smpd-stopMPICH2的配置设置工作账号MPICH2的配置设置环境参数MPICH2编程环境设置在编译器选项下设置include路径加入mpich2\include在编译器选项下设置lib路径加入mpich2\lib在编译器选项下加入链接库mpi.libMPICH2程序的布置和运行程序的布署程序要求分布在各结点的相同路径中。通过mpiexec运行mpiexec–n4hellompiexec–hosts4pc1pc2pc3pc4hellompiexec–hosts2pc12pc23hellompiexec–localonly4helloMPI并行程序设计MPI程序的一般模式#includempi.hintmain(intargc,char*argv[]){intsize,rank;MPI_Init(&argc,&argv);/*initializeMPI*/MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD,&rank);if(rank==0){master();}else{slave();}MPI_Finalize();/*cleanupMPI*/return0;}#includempi.hintmain(intargc,char*argv[]){intsize,rank;MPI_Init(&argc,&argv);/*initializeMPI*/MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD,&rank);switch(rank){case0:...case1:......default:...}MPI_Finalize();/*cleanupMPI*/return0;}#include“mpi.h”intfoo(inti){...}intmain(intargc,char*argv[]){inti,tmp,sum=0,group_size,my_rank,N;MPI_Statusstatus;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;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(“\nTheresult=%d\n”,sum);}else{S3: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_Finalize();return0;}10)(niifoo#includestdio.h#includempi.h#defineN1000000main(){doublesum=0,local,mypi,pi,dx;longi,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);}mypi=sum*dx;C:MPI_Reduce(&mypi,&pi,1,MPI_DOUBLE,MPI_SUM,0,MPI_COMM_WORLD);D:if(taskid==0)printf(“piis%lf\n”,pi);MPI_Finalize();}4)(1110102xarctgdxx#includeiostream#includempi.husingnamespacestd;intmain(intargc,char*argv[]){intsize,rank,x=-1;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&size);MPI_Comm_rank(MPI_COMM_WORLD,&rank);while(x!=0){if(rank==0){coutX=;cinx;coutReadxfromrankrankendl;}else{MPI_Recv(&x,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,&status);coutReceviedxfromrankrank-1endl;}if(ranksize-1){MPI_Send(&x,1,MPI_INT,rank+1,0,MPI_COMM_WORLD);coutSendxtorankrank+1endl;}MPI_Barrier(MPI_COMM_WORLD);}MPI_Finalize();return0;}MPI的通信模式分类发送接收阻塞通信MPI_SendMPI_RecvMPI_IrecvMPI_BsendMPI_RsendMPI_Ssend非阻塞通信MPI_IsendMPI_IbsendMPI_IrsendMPI_IssendB:BufferR:ReadyS:SynchonousI:Immediately#includeiostream#includempi.husingnamespacestd;intmain(intargc,char*argv[]){intrank;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&rank);charmsg1[7],msg3[17];doublemsg2[2];ints1,s2,s3;MPI_Statusstatus;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);intbufsize=3*MPI_BSEND_OVERHEAD+s1+s2+s3;char*buf=newchar[bufsize];MPI_Buffer_attach(buf,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);}elseif(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,17,MPI_CHAR,0,0,MPI_COMM_WORLD,&status);}MPI_Buffer_detach(&buf,&bufsize);delete[]buf;MPI_Finalize();return0;}缓冲模式if(rank==0){MPI_Recv(buffer,n,MPI_INT,1,1,MPI_COMM_WORLD,&status);MPI_Barrier(MPI_COMM_WORLD);}elseif(rank==1){MPI_Barrier(MPI_COMM_WORLD);MPI_Rsend(buffer,n,MPI_INT,0,1,MPI_COMM_WORLD);}就绪模式MPI中的通信安全问题例程:rank传递01230123#includempi.hmain(intargc,char**argv){intrank,size,x;MPI_Statusstatus;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_WORLD,&status);MPI_Finalize();return0;}MPI中的通信安全问题MPI中的通信安全问题MPI中的通信安全问题MPI中的通信安全问题例程:避免死锁的rank传递#includempi.hmain(intargc,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-1)%size,1,MPI_COMM_WORLD,&status);MPI_Send(&rank,1,MPI_INT,(rank+1)%size,1,MPI_COMM_WORLD);}MPI_Finalize();return0;}MPI中的通信安全问题捆绑接收发送:MPI_SendrecvintMPI_Sendrecv(void*sendbuf,intsendcount,MPI_Datatypesendtype,intdest,intsendtag,void*recvbuf,intrecvcount,MPI_Datatyperecvtype,intsource,intrecvtag,MPI_Commcomm,MPI_Status*status)MPI的数据类型MPI的数据类型是用于保障消息传递过程中的数据能够被正确的解释,而不是为了用于计算。消息传递中的类型匹配有类型数据的通信,发送方和接收方均使用相同
本文标题:并行算法与并行程序设计第05章 MPI并行程序设计
链接地址:https://www.777doc.com/doc-3926798 .html