您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 招标投标 > MPI-2011-03-02_880006259
计算科学与工程中的并行编程技术ParallelProgrammingTechnologyinComputationalScienceandEngineering都志辉清华大学计算机系Email:duzh@tsinghua.edu.cnPhone:62782530~duzh2020/1/112关于作业并行的好处并行的开销(代价)并行需要解决的主要问题基本的MPI编程技术主要内容基本概念基本通信语句编程示例第一部分基本概念关于并行程序基本特点是什么?可以支持或者刻画并行/并发执行并行程序是否一定需要并行机的支持才可以运行?可以模拟并行的结果(A=B)串行程序如何并行执行?自动并行化(软件-编译器,硬件-CPU)手工并行化改造-并行程序串行和并行程序相互转换的基础从应用的角度看效果相同并行编程的必要性?自动并行的有限性(有限的性能,有限的范围)单一硬件单元性能提高的有限性(物理极限)多核发展趋势并行需要解决的关键问题通信通信中断通信的核心与枢纽地位什么是SPMD程序一个静态的源程序,描述各个进程的综合行为多个动态的执行进程,只有在运行时才能表现出不同的行为什么是MPI(MessagePassingInterface)通俗的说法:提供一个大任务各个子任务之间进行信息交流的方式和方法专业的说法:消息传递编程模型消息传递编程标准消息传递编程库MPI的消息作用定义了MPI通信的方式与表示方法有助于实现移植性组成消息信封消息内容消息信封应该包括哪些部分?消息信封(envelop)源/目,标识,通信域100084清华大学计算机系都志辉(收)MPI消息的目和源目(Destination)消息的接收者源(Source)消息的提供者隐含目/源组通信MPI消息的标识TAG作用区别同一进程的不同消息P36图18隐含TAG组通信,由通信语句的序列决定消息的匹配MPI的通信域组成通信环境通信对象预定义通信域MPI_COMM_WORLD1234消息内容内容(data),在组通信中有变化形式起始地址,数据个数,数据类型必要?起始地址,长度?6个移植性不连续数据的发送抽象MPI的数据类型定义一个或多个,相同或不同的基本数据类型,以连续或不连续的方式形成的一种排列目的:移植,方便使用(抽象,不连续数据的传送)MPI是强数据类型的整型与实型匹配?MPI预定义基本数据类型MPI预定义数据类型与FORTRAN77数据类型的对应关系MPI预定义数据类型相应的FORTRAN77数据类型MPI_INTEGERINTEGERMPI_REALREALMPI_DOUBLE_PRECISIONDOUBLEPRECISIONMPI_COMPLEXCOMPLEXMPI_LOGICALLOGICALMPI_CHARACTERCHARACTER(1)MPI_BYTE无对应类型MPI_PACKED无对应类型P31表3MPI预定义基本数据类型MPI预定义数据类型与C数据类型的对应关系MPI预定义数据类型相应的C数据类型MPI_CHARsignedcharMPI_SHORTsignedshortintMPI_INTsignedintMPI_LONGsignedlongintMPI_UNSIGNED_CHARunsignedcharMPI_UNSIGNED_SHORTunsignedshortintMPI_UNSIGNEDunsignedintMPI_UNSIGNED_LONGunsignedlongintMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElongdoubleMPI_BYTE无对应类型MPI_PACKED无对应类型P31表4MPI提供的三种通信方式点到点通信(PointtoPoint)有且仅有两方(发送方和接收方)参与双方必须有匹配的消息信封和通信语句组通信(Collective)组内所有进程都参与才能完成各进程的调用形式都相同常见问题有的调用,有的不调用(主进程广播,从进程没有广播)广播语句和接收语句对应调用参数不对单边通信MPI-2单方完成放PUT拿GET作用?可否用其它的形式实现相同的功能应用实例留言簿MPI的进程MPI通信的对象MPI并行的单位MPI进程的标识区别不同的进程多进程并行执行进程间通信第二部分基本的通信语句基本的发送与接收语句MPI_SENDMPI_SEND(buf,count,datatype,dest,tag,comm)消息数据消息信封MPI_RECVMPI_RECV(buf,count,datatype,source,tag,comm,status)消息数据消息信封注意的问题语句对应(发与收必须一一对应)数据类型匹配(严格匹配)目和源要对应发方=接收方之源,收方=发送方之目TAG要匹配必须匹配接收语句的特殊性MPI_ANY_SOURCE,MPI_ANY_TAGFORTRAN和C调用形式的不同我是谁?获取个人身份:MPI_COMM_RANK(comm,rank)作用?是否仅仅知道本身的标识?(相邻关系)唯一性与不唯一性(通信域)同一个人以各种不同的身份加入不同的通信域组内共有多少人?获取给定组的大小:MPI_COMM_SIZE(comm,size)作用?编写通用的MPI程序使程序适合不同个数的进程初始化与结束初始化:MPI_INIT()结束:MPI_FINALIZE()能否省略初始化和结束调用?省掉初始化语句省掉结束语句漏掉会出莫名其妙的错误并行语言的产生方式全新的并行语言串行语言的扩展(标注语言)HPF库函数(MPI/PVM)改动渐小基本通信语句的个数THLIB(4个)BEGIN,END,SEND,RECEIVE缺点MPI(6个)INIT,FINALIZE,SEND,RECEIVE,RANK,SIZE结论消息传递的基本概念是简洁和简单的第三部分编程示例程序设计示例MPI程序的基本结构(符合C/F77的基本语法与格式要求)inlcude‘mpif.h’inlcude‘mpi.h’mpi_init()callmpi_init()mpi_finalize()callmpi_finalize()程序设计示例(续)“HelloWorld”的FORTRAN实现programmainimplicitnoneinclude'mpif.h'character*(MPI_MAX_PROCESSOR_NAME)processor_nameintegermyid,numprocs,namelen,rc,ierrcallMPI_INIT(ierr)callMPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)callMPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)callMPI_GET_PROCESSOR_NAME(processor_name,namelen,ierr)write(*,10)myid,numprocs,processor_name10FORMAT('HelloWorld!Process',I2,'of',I1,'on',20A)callMPI_FINALIZE(rc)end运行结果完全相同的语句,不同的执行结果不同进程输出语句的次序是任意的HelloWorld!Process1of4ontp5HelloWorld!Process0of4ontp5HelloWorld!Process2of4ontp5HelloWorld!Process3of4ontp5程序设计示例(续)“HelloWorld”的C实现#includempi.h”#includestdio.h#includemath.hvoidmain(argc,argv)intargc;char*argv[];{intmyid,numprocs;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(processor_name,&namelen);fprintf(stderr,HelloWorld!Process%dof%don%s\n,myid,numprocs,processor_name);MPI_Finalize();}注意C和FORTRAN调用形式的不同大小写的不同参数的不同SPMD程序只需要一个源程序SPMD程序是多进程并行执行每个进程都执行相同源程序的语句不同进程的执行结果是不同简单通信程序设计示例A将消息发给Binlcude‘mpi.h’inlcude‘mpi.h’MPI_Send()MPI_Recv()MPI_Init()MPI_Init()MPI_Finalize()MPI_Finalize()简单通信程序设计示例合并inlcude‘mpi.h’MPI_Send()/MPI_Recv()MPI_Init()MPI_Finalize()简单收发的MPI实现#includempi.h”#includestdio.h#includemath.hvoidmain(argc,argv)intargc;char*argv[];{intmyid,numprocs;intid;MPI_Statusstatus;charprocessor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);id=myid;printf(“beforecomm,ID=%d\n”,id)if(myid==0)thenMPI_Send(&id,1,MPI_INT,1,100,MPI_COMM_WORLD)if(myid==1)thenMPI_Recv(&id,1,MPI_INT,0,100,MPI_COMM_WORLD,&status)printf(“aftercomm,ID=%d\n”,id)MPI_Finalize();}#includestdio.h#includempi.h#defineMAX_NUM_PROCS10intmain(intargc,char*argv[]){intidx;intnum_procs,my_id,flag;ints;intr;MPI_Statusstatus;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&num_procs);MPI_Comm_rank(MPI_COMM_WORLD,&my_id);if(num_procs3){fprintf(stderr,Needatleast3processesforthisbug\n);MPI_Finalize();return0;}#ifdefDEBUGfprintf(stderr,%dStarting....\n,my_id);fflush(stderr);#endifif(my_id==1){idx=2;s=333;fprintf(stdout,%dstartsend(%d)to%d\n,my_id,s,idx);fflush(stdout);MPI_Send(&s,1,MPI_INT,idx,0,MPI_COMM_WORLD);#ifdefDEBUGfprintf(stdout,%dfinishedsendto%d\
本文标题:MPI-2011-03-02_880006259
链接地址:https://www.777doc.com/doc-2888924 .html