还剩18页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
并行计算技术课程报告题目矩阵乘法并行化的分析与实现课程名称并行计算技术学院计算机科学与工程学院专业计算机应用技术学号同学姓名而在用户程序中自己定义的常量、变量、过程和函数调用不要以开头,以免造成错误FORTRAN形式的MPI调用,一般全为大写虽然FORTRAN语法不区分大小写,而C形式的MPI调用,则为MPI_Xxxx_xxx的形式如上边的MPI_Comm_rankoMPI返回值全部MPI的FORTRAN子程序在最终的参数中都有一个返回代码,对于胜利的函数调用,返回代码包含的值为MPLSUCCESS对于失败的函数调用,其错误代码依靠于详细的MPI实现一些MPI操作是函数,没有这个参数,对MPI的C语言绑定,这个返回代码由函数的返回值直接给出,而不再作为参数
6.3MPI函数MPI实际上是一个供应并行程序消息传递机制的函数库,有40多个函数,常用的有6个基本函数下面以C语言为例简洁介绍这些函数lMPI_Init函数定义intMPI_Initint*argcchar***argv功能用命令行参数初始化MPI环境输入argc、argv-表示命令行参数,同C语言的main函数参数格式,argv中包含欲并行运行的进程数输出返回值-非零/零表示初始化是否胜利说明该函数必需为程序中第一个调用的MPI函数示例MPI_Initargcargv;argcargv引用的是main函数的参数MPI_Finalize函数定义intMPI_Finalizevoid功能结束MPI程序的运行,指结束MPI环境的使用输入无输出返回值-非零/零表示结束MPI环境是否胜利说明该函数必需为程序中最终一个调用的MPI函数示例MPI_FinalizeMPI_Comm_size函数定义intMPI_Comm_sizeMPI_Comiricommint*size功能得到总进程数输入comm通信域句柄系统默认的为MPI_COMM_WORLD也可自己定义输出size即通信域comm内包括的进程数整数MPI_Comm_rank函数定义intMPI_Comm_rankMPI_Commcommint*rank功能得到本进程的进程号输入comm该进程所在的通信域句柄输出rank调用进程在comm中的标识号
(5)MPI_Send函数定义intMPI_Send(void*bufintcountMPI_DatatypedatatypeintdestintlagMPI_Commcomm)功能发送消息给特定的进程输入buf发送缓冲区的起始地址(可选类型)count将发送的数据的个数(非负整数)datatype发送数据的数据类型(句柄)dest目的进程标识号(整型)tag消息标志(整型)comm通信域(句柄)输出无
(6)MPI_Recv函数定义intMPI_Recv(void*bufintcountMPI_DatatypedatatypeintsourceintlagMPI_CommcommMPI_Status*status)功能接受别的进程发过来的消息输入count最多可接收的数据的个数(整型)Datatype接收数据的数据类型(句柄)Source接收数据的来源即发送数据的进程的进程标识号(整型)Tag消息标识与相应的发送操作的表示相匹配相同(整型)Comm本进程和发送进程所在的通信域(句柄)输出buf接收缓冲区的起始地址(可选数据类型)Status返回状态(状态类型MPI_Status)7总结多核处理器的普及与并行计算机的进展极大地促进了并行程序设计的进展,越来越多的领域尤其是高性能计算与进程通信等领域都使用了并行计算的实现方法并介绍了几种矩阵相乘的并行算法最终本文使用并行编程的一种重要工具MPI实现了一种矩阵相乘的并行算法通过对原问题进行建模分析,找出其计算的并行性,从而使用并行计算的方法解决并与矩阵乘法的串行算法的性能进行了比较,说明白并行算法能够很好地应用在矩阵相乘的计算,并提高计算的效率参考文献
[1]陈国良.并行算法结构设计与分析[M].高等教育出版社2003
[2]都志辉,李三立,陈渝,刘鹏.高性能计算并行编程技术——MPI并行程序设计.北京清华高校出版社.2001
[2]张林波,迟学斌莫则尧,李若.并行计算导论.北京:清华高校出版社.2006
[3]莫则尧,刘兴平,廖振民.应用程序并行与优化关键技术争论[J].数值计算与计算机应用2002KosibaEDWrightJRCobbsAE.Discreteeventsequencingasatravelingsalesmahproblem[J].ComputersinIndustry2004
[5]雷澜.矩阵乘法的并行计算及可扩展性分析[J].重庆工商高校学报2004212:121-123
[6]蒋昌俊.矩阵乘法的一个最优并行算法[J].黑龙江自动化技术与应用1993122:12-15
[7]陈传伟.并行计算机系统下的矩阵乘法[J].武汉科技学院学报20222111:4-6
[8]唐俊奇多处理机中矩阵乘法的算法争论[J].中国西部科技20072:4-8
[9]程豪张云泉,张先轶李玉成.CPU-GPU并行矩阵乘法的实现与性能分析[J].计算机工程20223613:24-2629
[10]赵庆敏,李伟平.多处理机系统分析[J].微计算机应用2005261:113—115
[11]马晶燕,于双元.基于MPICH的MPI并行环境分析[J].科技资讯200630:
627.KUMARVRAOVN.Paralieddepth-firstSearchIIAnalysis[J].InternationalJournalParallelProgramming198716633―41ShameemAkhterJasonRoberts.Multi2CoreProgramming[M].d匕京电子工业出版社
2007.FeboCincottiDonatellaMattiaFabioAloiseetal.High2resolutionEEGTechniquesforBrain2computcrInterfaceApplications[J].JournalofNeuroscienceMethods20041671:
31242.YunhuaWJeanGotman.TheInfluenceofElectrodeLoca2tionErrorsonEEGDipoleSourceLocalizationwithaRea21isticHeadModel[J].ClinicalNeurophysiology20051121:
177721780.
[16]卢琦.矩阵在并行计算中的通信优化争论[J].软件导刊2022810:10-12附录程序主要代码:#includestdio.h#includestdlib.h#includempi.h#defineintsizesizeofint#definefloatsizesizeoffloat#definecharsizesizeofchar#defineAxyA[x*K+y]#defineBxyB[x*N+y]#defineCxyC[x*N+y]#defineaxya[x*K+y]#definebxyb[x*n+y]#definebufferxybuffer[x*n+y]/*此宏用来简化对标号为奇数的处理器内的缓冲空间的访问*/#defineclxyc[x*N+y+I*n]float*a*b*cbuffer;ints;float*A*B*C;intMNKP;intmn;intmyid;intp;FILE*dataFile;*//*A[MK]B[PN].正确的状况下K应当等于P否则无法进行矩阵相乘*//*保存工作站集群中处理器数目,也即通信子大小*//*用于读取输入文件内容和将计算结果输出到结果文件的临时文件指针MPI_Statusstatus;doubletimel;doublestarttimeendtime;/*函数名readData功能此函数被rankID为0的进程调用,负责从dataln.txt文件中读入A[MK]B[PN]两个相乘矩阵的数据,并为结果矩阵C[MN]安排空间其中C[NN]=A[MK]*B[PN]输入无返回值无*/voidreadDataintij;starttime=MPI_Wtime;dataFile=fopendataIn.txtnHrn;fscanfdataFileH%d%dHMK;/*读取矩阵A的行,列数MK*/A=float*mallocfloatsize*M*K;fori=0;iM;i++forj=0;jK;j++fscanfdataFile;%f\A+i*K+j;fscanfdataFilen%d%dnPN;ifK!=Pprintfntheinputiswrong\nn;exitl;B二float*mallocfloatsize*K*N;fori=0;iK;i++forj=0;jN;j++fscanfdataFile;%f\B+i*N+j;fclosedataFile;/*为矩阵A安排空间*//*读入矩阵A的各元素*//*读取矩阵B的行列数PN*//*K应当等于P否则矩阵无法相乘*//*为矩阵B安排空间*//*从文件中读入矩阵B的各元素*/printfHInputoffile\HdataIn.txt\n\nn;printfn%d\t%d\n”MK;fori=0;iM;i++forj=0;jK;j++printfn%iMHAiJ;printfn\nn;printfn%d\t%d\n”KN;fori=0;iK;i-t-+forj=0;jN;j++printf%f\t”Bij;printfn\nn;C=float*mallocfloatsize*M*N;/*输出A矩阵的维数*//*输出A矩阵的数据*//*输出B矩阵的维数*//*输出B矩阵的数据*//*为结果矩阵C[MN]安排空间*/*函数名gcd*功能*输入此函数用来返回两个整数的不大于group_size的最大公因子MN:要求最大公因数的两个整数group_size所求公因子必需小于此参数,此参数代表用户指定的通信子大小*返回值M和N的不大于group_size的最大公因子*/intgcdintMintNintgroup_sizeinti;fori=M;i0;i—ifM%i==0N%i==0i=group_sizereturni;return1;/*函数名printResult功能此函数被rankID为0的进程调用,用来将・ABC矩阵打印输出给用户,并输出用于分发数据和并行计算的时间输入无返回值无/voidprintResultintij;printfn\nOutputofMatrixC二AB\nn;fori=0;iM;i++/*输出C矩阵的结果数据*/{forj=0;jN;j++printfn%f\tnCij;printfn\nn;endtime=MPI_Wtime;printfn\nM;printfnWholerunningtime=%fseconds\nHendtime-starttime;printfDistributedatatime=%fseconds\nntime1-starttime;printfnParallelcomputetime二%fseconds\nnendtime-time1;/*函数名main功能程序的主函数输入argc为命令行参数个数;argv为每个命令行参数组成的字符串数组输出返回0代表程序正常结束;其它值表明程序出错/intmainintargcchar**argvintijklgroup_sizemp1mm1;MPI_Initargcargv;MPI_Comm_sizeMPI_COMM_WORLDgroup_size;MPI_Comm_rankMPI_COMM_WORLDmyid;p=group_size;〃下面一段程序负责从dataln.txt文件中读入A[MK]B[PN]两个相乘矩阵的数据//并为结果矩阵C[MN]安排空间C[NN]=A[MK]*B[PN]//留意这段程序只有编号为0的处理器才执行此步操作ifmyid==OreadData;ifmyid==0/*由编号为0的进程将AB两矩阵的行列维数MKN发送给全部其他进程*/fori=l;ip;i++MPI_SendM1MPI_INTiiMPI_COMM_WORLD;MPI_SendK1MPI_INTiiMPI_COMM_WORLD;MPI_SendN1MPI_INTiiMPI_COMM_WORLD;else/*编号非0的进程负责接收AB两矩阵的行列维数MKN*/MPI_RecvMlMPI_INT0myidMPI_COMM_WORLDstatus;MPI_RecvK1MPI_INT0myidMPI_COMM_WORLDstatus;MPI_RecvNlMPI_INT0myidMPI_COMM_WORLDstatus;buffer=float*mallocK*n*floatsize;ifa==NULL||b==NULL||c==NULL/*假如安排空间出错,则打印出错信息*/printfAllocatcspaceforaborcfail!11;ifmyid=0/*标号为0的处理器将应当它拥有的矩阵AB的元素读入自己的ab中*/fori=0;im;i++forj=O;jK;j++aij=Aij;fori=0;iK;i++forj=O;jn;j++bij=Bij;ifmyid=0/*标号为的处理器将其他处理器的初始数据分别发给各处理器*/fori=l;ip;i++MPI_SendAm*i0K^mMPI_FLOATiiMPI_COMM_WORLD;forj=0;jvK;j++MPI_SendBjn*inMPI_FLOATiiMPI_COMM_WORLD;freeA;freeB;/*至此,AB两矩阵的数据已经完全被分散到各处理器释放AB所占空间*/else/*标号非0的处理器从0处理器接受各自的初始矩阵数据*/MPI_RecvaK*mMPI_FLOAT0myidMPI_COMM_WORLDstatus;forj=O;jK;j++MPI_Recvbj0nMPI_FLOAT0myidMPI_COMM_WORLDstatus;ifmyid==0timel=MPI_Wtime;/*标号为的处理器纪录开头矩阵相乘计算的时间*/fori=0;ip;i++/*一共进行p轮计算*/l=i+myid%p;fork=0;km;k++forj=O;jn;j++forclkj=0s=0;sK;s+4-clkj+=aks*bsj;mm1=p+myid-1%p;/*计算本进程的前一个进程的标号*/mpl=myid+l%p;/*计算本进程的后一个进程的标号*/ifi!=p-lifmyid%2==0/*偶数号处理器先发送后接收*/MPI_SendbK*nMPI_FLOATmm1mm1MPI_COMM_WORLD;MPI_RecvbK*nMPI_FLOATmp1myidMPI_COMM_WORLDstatus;else/*奇数号处理器先将B的列块存于缓冲区buffer中,然后接收编号在其后面的处理器所发送的B的列块,最终再将缓冲区中原矩阵B的列块发送给编号其前面的处理器*/fork=0;kK;k++forj=0;jn;j+4-bufferkj=bkj;MPI_RecvbK*nMPI_FLOATmp1myidMPI_COMM_WORLDstatus;MPI_SendbufferK*nMPI_FLOATmm1mm1MPI_COMM_WORLD;ifmyid==O/*标号为0的进程直接将计算结果保存到结果矩阵C中*/fori=0;im;i++forj=0;jN;j++Cij=*c+i*N+j;ifmyid!=O/*标号非0的进程则要把计算结果发送到标号为0的处理器中去*/MPI_Sendcm*NMPI_FLOAT0myidMPI_COMM_WORLD;else/*标号为0的进程负责接收其他进程的计算结果并保存到结果矩阵C中*/fork=l;kp;k++MPI_Recvcm*NMPI_FLOATkkMPI_COMM_WORLDstatus;fori=0;im;i++forj=0;jN;j++Ck*m+ij=*c+i*N+j;ifmyid==O/*0号处理器负责将ABC矩阵打印输出给用户,并输出用于分发数据和并行计算的时间*/printResult;MPI_Finalize;ifmyidp/*释放全部临时安排空间*/{frcca;freeb;freec;ifmyid==0/*只有0号进程要释放C*/freeC;ifmyid%2!=0/*只有奇数号进程要释放buffer*/freebuffer;return0;dataln.txt:331234562013310462185612运行步骤及其结果第一步compile:mpiccmatrix.c-omatrix其次步run:mpirun-np4matrix第三步result:Inputoffilendataln.txtnOutputofMatrixC二AB
29.
00000024.
00000080.
00000057.
00000025.
00000014.000000Wholerunningtime=
0.012105secondsDistributedatatime=
0.007531secondsParallelcomputetime=
0.004574seconds矩阵乘法并行化的分析与实现摘要本文针对科学与工程计算中的大型矩阵乘积问题进行争论,介绍了几种矩阵相乘的并行算法在MPI并行计算环境下实现了一种nXn阶矩阵相乘的并行算法,并与传统的串行算法进行了性能方面的分析和比较分析了其通信时间开销和计算性时间简单性,说明白并行计算在矩阵相乘中巨大优势解决了多处理机系统中因处理器间的通信速度相对滞后所产生的负面影响,给数值计算带来了很大的便利关键词并行计算;矩阵相乘;MPI;并行算法Abstract:Thispaperstudythelargematrixmultiplicationwhichisalwaysusedinthescienceandengineeringcomputinganddescribesseveralparallelmatrixmultiplicationalgorithms.Thenweimplementaparallelalgorithmofnxnmatrixmultiplication.Finallyanalysisandcomparisonofperformancebetweenthetwoalgorithmsareprovided.Thecommunicationtimeandthecomputationtimearealsoanalyzed.Soitisconcludedthatparallelcomputingshowsgreatadvantagesinmatrixmultiplication.Thealgorithmshavesolvedtheproblemofthenegativeinfluenceproblemresultingfromcommunicatingspeedsrelativelaginthemulti-processorsystemandbroughttheverybigconvenienceforthevaluecomputation.Keywords:parallelcomputing;matrixmultiplication;MPI;parallelalgorithm1引言矩阵乘法是一个典型的数学问题,由于其计算量大,通常用来测试计算机的浮点的运算速度,对于并行机,其并行效率的好坏也可以通过矩阵乘法测试出来在过程掌握、图像处理等应用领域中都需要用到大量的矩阵乘法操作,并且矩阵乘法计算性能是系统性能的关键因素传统的计算机在计算矩阵乘法时采纳串行算法,这需要占用较多的工作单元和较大的存储单元矩阵乘法的时间简单度按一般算法为OOP)而随着n值的增大,计算效率将受到很大的影响⑶随着科学技术的进展,并行计算机的消失,使大规模的提高矩阵的运算速度成为可能,特殊是n值很大的矩阵,采纳并行算法,已经可以实现并行计算机采用多个处理器同时解决某一问题,是当前提高计算速度的主要途径矩阵的向量积运算是数值分析领域中非常常用的基本运算在计算机编程中,矩阵是一些(或代表数的变量)二维数组一个nxm的矩阵A我们在挨次编程中这种结构可以用二维数组加以表示,并且通常用数组来存储一个矩阵为了实现并行计算,很自然的需要将它们进行预划分,然后指派给不同的处理器常用的矩阵分块运算都是基于将矩阵分块再用递归算法进行计算,比较闻名的分块矩阵乘法算法有Cannon算法,Fox算法,DNS算法⑹设A愚行馨法p矩阵,8=%是px〃矩阵,其乘积C=AB=g为机义〃矩阵矩阵乘法的内积算法网就是普通的矩阵乘法,其中c=煲嬲木港界,攀项寸靠cyjj潴=个痴需要n-1次加法和n次乘法,因而逐项计算事个台羹甯嬴行「I/加法关1/‘次条法所拓内积算法的时间简单度是0吟为了提高计算效率,可以用临时变量sum代替eq这样在内层for循环的每一次迭代中就不必进行地址计算了3并行算法的实现
3.1并行算法一一行列划分算法通过分析矩阵相乘的过程,可以发觉矩阵A的第i行与矩阵B的第j列对应元素乘积的累加和即为矩阵C的第i行第j列元素,而这个过程与i值的挨次是无关的上述矩阵的串行算法中,其3层循环均可并行化由粒度大小分析可知,总应试图选取最外层循环并行化⑹假定有P台处理器,其并行算法如下设AB都是nXn矩阵,采纳行列划分的方法将AB分块,A=AlA2---ApTB=如下形式%C=AB=(月B2…Bp)由上式,C的值转化为P2个低级矩阵的乘积,每个乘积是独立的,可以并行计算简洁起见,不妨设n可被P整除,即AB可匀称地分为P块,上述矩阵乘积可以用下面的并行算法⑺1数据存储将AiBi分别存入处理机ii=l2…,p的矩阵AiBi中其中Ai为n/pXn矩阵,Bi为nXn/p矩阵,并令k=l;2信息轮换传送处理机i将Bi中元素传送到第i+1台处理机i=L2p-1;第p台处理机将Bp中的元素传送到第1台处理机即若i+lp则j=l;否则j=i+l将处理机i中Bi的元素传送给处理机j其中j=L2p;3数据的并行计算每台处理机并行计算AiXBi并依据AiBi中元素在AB中的位置,将结果存入其工作矩阵Ci中相应单元,Ci是一个n/pXn矩阵;4信息接收每台处理机接收上一台处理机送来的信息,并存入其Bi中,掩盖Bi中原来的信息即若则j=p;否则j=i-l处理机i接收处理机j传送来的信息;5假如np则令n=n+l再goto2并行计算AiXBi假如n=p则各处理机并行计算AiXBi运行结束表1矩阵相乘并行计算过程算法有P个进程,每个进程计算C矩阵的n/p行计算一行所需的时间为01所以每个进程的计算简单度为On2*n/p=On3/p;又由于各进程刚好同步一次,所以同步的开销为Op因此,整个算法的时间简单度为0n3/p+p可见,此方法能较大地节省计算机的工作单元,提高计算速度和效率本文中采纳的是行列划分算法实现矩阵相乘的并行化的,此外还有几种数据划分的方法,行行划分算法、列列划分算法、列行划分算法、cannon算法,这里就以行行划分和Cannon算法为例进行简洁介绍
3.2并行算法一一行行划分算法这里将矩阵A和B均划分为行块子矩阵,矩阵A的划分同行列划分中的相同,B的划分如下B=…BZf⑶Ci为Ai相对应的C的第i个块,进一步把Ai按列分块与B的行分块相对应,记……4gl4p-1从而有G=AxB=^AijxBj
(5)3并行算法Cannon算法Cannon算法是一种优秀的并行算法,在多CPU的处理器上,采纳Cannon算法能够提高计算效率、高效采用计算机资源假设矩阵AB和C可以分成mxm块矩阵,也即A=AijmxmB=Bijmxm和C=Cijmxm其中AijBij和Cij是nxn矩阵进一步假定有p=mxm个处理机为了争论Cannon算法,引人块置换矩阵Q=Qij使得f/nj=i+lmodmQij=10„其他情况其中In和On分别是n阶单位矩阵和零矩阵定义对角块矩阵£二崛理=崛4〃,容易推曲「XL、因此0=Ax*X1*0,x5=X ox即其中b6=Q1xB=QxB/采用这个递推关系式,并把处理机结点编号从一维映射到二维,即有Pmyid=Pmyrowmycol数据AijBij和Cij存放在Pij中,简洁得到下面的在处理机Pmyid结点上的算法该算法具有很好的负载平衡,其特点是在同一行中广播A计算出C的部分值之后,在同列中滚动B数据交换量DTAi=mx2x〃2+m-lx2xn2=22m—ln2=4m2n2/yfp-4m2n2/y[p由于计算量对每个处理机来说是相同的,因此在选择算法时只需考虑通信量从所给出的这五个并行计算矩阵乘积的算法可以看出,对于方阵的乘积,当p24时,Cannon算法具有优越性
3.4串行算法与并行算法的性能比较在MPI并行环境中进行试验,MPIMessagePassinginterface消息传递接口作为目前最重要的并行编程工具,供应了丰富的消息传递库函数极大便利了并行算法的实现我们通过试验得到了矩阵并行计算的时间和串行计算的时间如下表2所示下面以实例来说明并行算法相对于串行算法的效率改进表2中共有8组数据,每组数据表示两个随机生成的100x100阶矩阵的相乘其中计算时间由MPI供应的MPI_Wtime库函数求得单位为秒,并行计算使用了10个结点共开启100个进程完成从表中可以看出,虽然进程间通信需要肯定的时间,并行算法相对于串行算法在性能上有了很大改进表2矩阵相乘的串行算法和并行算法的性能比较4并行算法分析⑹1计算时间每个代的运行时间是立2通信时间设t为发送消息的启动时间,t为传送每个浮点数的通信时间由SW于算法要在由m台处理机组成的阵列中作两次多对多广播,每次包含处理机阵列上全部行或列的m次并发广播,发送消息的个数由吃个元素的子矩阵组成,所以整个通信时间为2mf+P系统开销时间T0=pT「T、=2p«+3可扩展性分析可扩展性是指假如在一个给定的体系结构上实现并行算法,且随系统规模的增加而适当增加问题规模,并行系统的平均系统开销保持不变详细来讲,并行系统的可扩展性度量方法,可以采纳等效率度量方法所谓等效率指系统规模增加时,测量增加多少运算量会保持效率不变假如问题规模W保持不变,只增加系统的规模P则并行开销将会增大,使系统效率降低而当系统规模P不变,只增加问题规模W由于并行开销增长得比W慢,从而使效率增加因此,可以让W和P同时增长,以保持效率不变其中巨〃为算法效率,A为并行机上每个基本操作的平均时间,7为系统的总开销时间K=2区-5又已知W=/,要使1和2相等,肯定存在常数a使得〃=以九后所以,问题规模W和系统规模P的关系为3/2皿二水九3PL34可扩展性的瓶颈分析:一般状况下增加处理器数会增加额外开销和降低处理器采用率;所以对于一个特定的并行系统、并行算法或并行程序,它们能否有效的采用不断增加的处理器的力量是受限的.5并行程序设计环境在当前并行机上,比较流行的并行编程环境可以分为三类消息传递、共享存储和数据并行,它们的典型代表、可移植性、并行粒度、并行操作方式、数据存储模式、数据安排方式、学习难度、可扩展性等方面的比较如下由上表可以看出⑴共享存储并行编程基于县城级细粒度并行,仅被SMP和DSM并行机所支持可移植性不如消息传递并行编程但是,由于它们支持数据的共享存储,所以并行编程的难度较小,但一般情形下,当处理机个数较多时,其并行性能明显不如消息传递编程2消息传递并行编程基于大粒度的进程级并行,具有最好的可移植性,几乎被当前流行的各类并行机所支持,且具有很好的可扩展性但是,消息传递并行编程只能支持进程间的分布存储模式,即各个进程只能直接访问其局部内存空间,而对其他进程的局部内存空间,而对其他进程的局部内存空间的访问只能通过消息传递来实现因此,学习和使用消息传递并行编程的难度均大于共享存储和数据并行两种编程模式6MPI程序设计基础
6.1MPI简介MPIMessagePassingInterface是一种基于消息传递的并行程序设计标准,它明确定义了一整套用户接口,而对于详细实现,除了给出了建议以外,并没有太多的限制由于它在标准化方面所进行的努力,它已经成为了消息传递并行程序程序设计的代表和事实上的标准在MPI标准的制定过程中,制定者盼望MPI能够达到下面的三个目标较高的通信性能较好的程序可移植性可以满意消息传递程序设计的各种要求由于MPI是一个库而不是一种程序语言,因此对MPI的使用必需和特定的程序语言结合起来进行通常状况下,对一个MPI的实现,对FORTRAN和C语言的支持是基本的要求
6.2MPI的实现在实际的系统中,MPI以程序库的形式消失,通过库函数接口给用户供应MPI法律规范定义的功能这样的库被称为MPI实现SUN公司供应的SUNClusterTools即是一个MPI的实现一个简洁的C语言版MPI程序//simple.c#includempi.h#inlucdestdio.h#includemath.hintmainintargcchar**argvintmyidnumprocs;intnamelen;charprocessor_name[MPI_MAX_PROCESSOR_NAME];//MPIInitializationphaseMPI_Initargcargv;MPI_Comm_rankMPI_COMM_WORLDmyid;MPI_Comm_sizeMPI_COMM_WORLDnumprocs;MPI_Get_processor_nameprocessor_namenamelen;//TheworkingphasePrintffThisisProcess%dof%don%s\n”myidnumprocsprocessor_name;//MPIFinalizationphaseMPI_Finalize;用mpicc命令将这个程序编译mpicc-osimplesimple.c然后用mpirun来运行这个程序假定已经设置好了配置文件,关于MPI环境的配置可以参考第三章SunClustertools的安装配置mpirun-np4simple为这个程序指定四个工作进程,假如这个程序在一个集群系统的某台计算机clusterl上运行,它的输出结果可能如下ThisisProcess0of4onclusterlThisisProcess2of4onclusterlThisisProcess1of4onclusterlThisisProcess3of4onclusterl假如这个程序在一个集群系统的四台不同计算机clusterl-cluster4上运行,它的输出结果可能如下ThisisProcess0of4onclusterlThisisProcess2of4oncluster3ThisisProcess1of4oncluster2ThisisProcess3of4oncluster4从上边的例子可以看出,编写一个MPI程序,在配置好MPI的环境之后,有以下特占・
八、、•1包含MPI的头文件声明,如例子中的#includempi.h2MPI相关变量的声明,如例子中的intmyidnumprocs;等,声明白程序的id和总的进程数3MPI初始化过程,MPI函数调用,获得程序必需的系统信息,如例子中的MPI_Initargcargv;3通过MPI的通信,包含在程序体中,如例子中的MPI_Comm_rankMPI_COMM_WORLDmyid;是用来得到当前进程号的通信接口,MPI的主要功能即供应进程间通信的接口5MPI结束过程,释放系统资源如例子中的MPI_Finalize;MPI程序的一些惯例MPI命名法律规范全部MPI的名字都有前缀不管是常量、变量还是函数调用的名字都是这样第k次并行计算结果处理器i12•••pK=1AiBiA2B2•••ApBpK=2AiBpA2B1••♦ApBp.i•••••••••••••••K=pAiBiA2B3•••ApBi组数串行一博时间并行媾时间串行计篡此间/并行计算时间
10.
0075980.
0009118.
3402920.
0075390.
0008668.
7055430.
0075550.
0009358.
1675740.
0076030.
0008558.
8924050.
0077030.
0009278.
3074460.
0076550.
0009038.
4773070.
0076420.
0008758.
7337180.
0075660.
0008658.74682特征消息传递共享存储数据并行典型代表MPI、PVMOpenMPHPF可移植性全部流行并行机SMP.DSMSMP、DSN、MPP并行粒度进程级大粒度进程级细粒度进程级细粒度并行操作方式异步异步松散同步数据存储模式分布式存储共享存储共享存储数据安排方式显式隐式半隐式学习入门难度较难简洁偏易可扩展性好较差一般。
个人认证
优秀文档
获得点赞 0