并行计算简介幻灯片课件.ppt

上传人:豆**** 文档编号:59820485 上传时间:2022-11-13 格式:PPT 页数:149 大小:3.13MB
返回 下载 相关 举报
并行计算简介幻灯片课件.ppt_第1页
第1页 / 共149页
并行计算简介幻灯片课件.ppt_第2页
第2页 / 共149页
点击查看更多>>
资源描述

《并行计算简介幻灯片课件.ppt》由会员分享,可在线阅读,更多相关《并行计算简介幻灯片课件.ppt(149页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、并行计算简介并行计算-高性能计算1.并行计算并行计算(Parallel Computing)高端计算高端计算(High-end Parallel Computing)高性能计算高性能计算(High Performance Computing)超级计算超级计算(Super Computing)任何高性能计算和超级计算都离不开使用并行技术任何高性能计算和超级计算都离不开使用并行技术1.计算科学计算科学与传统的两种科学,即与传统的两种科学,即理论科学理论科学和和实验科学实验科学,并立,并立被认为是人类认识自然的三大支柱,他们彼此相辅相成地推被认为是人类认识自然的三大支柱,他们彼此相辅相成地推动科学发

2、展与社会进步。在许多情况下,或者是理论模型复动科学发展与社会进步。在许多情况下,或者是理论模型复杂甚至理论尚未建立,或者实验费用昂贵甚至无法进行时,杂甚至理论尚未建立,或者实验费用昂贵甚至无法进行时,计算就成了求解问题的唯一或主要的手段。计算就成了求解问题的唯一或主要的手段。2004年4月2并行:古老的思想!“.并行计算并不是什么新的思想并行计算并不是什么新的思想,只是将它扩展应用于计算机而已只是将它扩展应用于计算机而已”.作者也不认为这种扩展应用会存在什么无法克服的困难.但也不要期待有效的并行编程方法与技术能够在一夜之间诞生.期间还需要有许多的工作和实验要做.毕竟,今天的编程技术(串行)是若

3、干年来艰苦的探索才取得的.现在编程工作似乎成了一种令人单调乏味的工作,事实上,并行编程的出现将会使重新恢复编程工作者们的探索精神.”(Gill,S.(1958),“ParallelProgramming”TheComputerJournal,vol.1,April,pp.2-10.)Parallel Programming with MPIby Peter Pacheco(2000)2004年4月3什么是并行计算?z并行计算并行计算:由运行在多个部件上的小任务合作来求解一个规模很大的计算问题的一种方法z例:在曙光2000上用8个节点计算的Mandelbrot集结果(Mandelbrot为分形理

4、论创始人)2004年4月4现代计算机的共同特点:并行性2004年4月5现代计算机的共同特点:并行性2004年4月6为什么要做并行计算?应用需求2004年4月7为什么要做并行计算?人类对计算及性能的要求是无止境的从系统的角度:集成系统资源,以满足不断增长的对性能和功能的要求从应用的角度:适当分解应用,以实现更大规模或更细致的计算2004年4月8为什么要做并行计算?问题:科学和工程问题的数值模拟与仿真计算密集数据密集网络密集三种混合要求:在合理的时限内完成计算任务秒级制造业分钟级短时天气预报(当天)小时级中期天气预报(310日)尽可能快长期天气预报(气候)可计算湍流模拟2004年4月92004年4

5、月10并行计算的功能z降低单个问题求解的时间z增加问题求解规模、提高问题求解精度z(多机同时执行多个串行程序)容错、更高的可用性、提高吞吐率2004年4月11如何实现并行计算?分而治之!2004年4月12分而治之z并行化的主要方法并行化的主要方法:分而治之分而治之y根据问题的求解过程,把任务分成若干子任务(任务级并行或功能并行)y根据处理数据的方式,形成多个相对独立的数据区,由不同的处理器分别处理(数据并行)2004年4月13讲座主要内容提示z并行计算简介z编译环境y常用编译器y编译优化y如何编译z数学库z并行计算机体系结构z并行软件环境z并行计算机性能评测zMPI、PVM、OpenMP200

6、4年4月14GNUCompilerzGNUCompilery自由软件,一般操作系统都自带y支持C/C+、Fortran77、Java、COBAL等等许多语言y支持大部分硬件平台y高性能计算中常用的:xC/C+:GCC(GNUC/C+Compiler)xFortran77:G77x不支持Fortran90/95x不支持OpenMPy是最常用的编译器,性能一般(相对于一些针对特定平台优化的编译器)y由于缺少对Fortran90/95,限制了其在高性能计算中的使用2004年4月15PGICompilerzPGICompilery由Portland公司开发的编译器y支持AMDOpteron/Altho

7、n处理器、IntelXeon处理器等,在Opteron上同时支持32-bit和64-bit()y支持Linux、Windowsy支持C/C+(pgcc)、Fortran77(pgf77)、Fortran90/95(pgf90)、HPF(HighPerformanceFortran)y支持多线程和OpenMPy最新版本:5.1y需要购买,但可以从网上得到15天试用版本http:/2004年4月16IntelCompilerzIntelCompilery由Intel公司针对Intel处理器开发(Xeon、Pentium)y支持Linux、Windowsy支持C/C+(icc:IntelC/C+Co

8、mpiler)、Fortran77/90/95(ifc:IntelFortranCompiler)y支持多线程和OpenMPy最新版本:8.0y需要购买,但可以从网上得到30天试用版本http:/ 77语言源代码文件y.o:编译后的目标文件y.a:由目标文件构成的档案库文件y.C、.cc、.cxx:C+源代码文件y.f90:Fortran 90语言源代码文件y.h:程序所包含的头文件2004年4月20基本的用法cc/f77/f90 options filenames 编译器名 编译参数 编译文件其中options就是编译器所需要的参数,filenames给出相关的文件名称2004年4月21常用

9、编译参数z-c:只编译,不连接成为可执行文件,编译器只是由输入的.c/.f等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。z-o output_filename:确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,就给出预设的可执行文件a.outz-g:产生符号调试工具所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。z-O:对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。z-O2、-O3

10、、-O4:比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。(具体和编译器相关)2004年4月22常用编译参数z-Idirname:将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况:A)#include B)#include“myinc.h”其中,A类使用尖括号(),B类使用双引号(“”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻

11、找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。2004年4月23常用编译参数z-Ldirname:将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。z-lname:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定

12、的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。上面我们简要介绍了编译器最常用的功能和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。2004年4月24GCC应用举例1.gcc hello.c生成a.out2.gcc o hello helo.c生成hello3.gcc O o hello hello.c 生成hello4.gcc O2 o hello hello.c 生成hello5.gcc c hello.c生成hello.o gcc o hello hello.o生成hello6.gcc c hello1.c生成hello1.o gcc c hello2.c

13、生成hello2.o gcc o hello hello1.o hello2.o 生成hello7.gcc o test test1.o lm I/home/czn/include2004年4月25Make简介z在开发大系统时,经常要将程序划分为许多模块。各个模块之间存在着各种各样的依赖关系,在Linux中通常使用 Makefile来管理y由于各个模块间不可避免存在关联,所以当一个模块改动后,其他模块也许会有所更新,当然对小系统来说,手工编译连接是没问题,但是如果是一个大系统,存在很多个模块,那么手工编译的方法就不适用了。y为此,在Linux系统中,专门提供了一个make命令来自动维护目标文件

14、。y与手工编译和连接相比,make命令的优点在于他只更新修改过的文件,而对没修改的文件则置之不理,并且make命令不会漏掉一个需要更新的文件2004年4月26一个简单的例子z先举一个例子:a.c b.c两个程序a.c extern void p(char*);main()p(hello world);b.c void p(char*str)printf(%sn,str);zMakefile hello:a.c b.c gcc a.c b.c-o hello 注意这里是一个Tab z执行makegcc a.c b.c-o hello 产生一个叫hello的可执行程序2004年4月27书写make

15、file文件zMakefile时由规则来组成的,每一条规则都有三部分组成:目标(object),依赖(dependency)和命令(command).在上面的例子中,Makefile只有一条规则,其目标为hello,期依赖为a.c b.c,其命令为gcc a.c b.c-o helloz依赖可以是另一条规则的目标,也可以是文件.每一条规则被这样处理.如目标是一个文件是:当它的依赖是文件时,如果依赖的时间比目标要新,则运行规则所包含的命令来更新目标;如果依赖是另一个目标则用同样的方法先来处理这个目标.如目标不是一个存在的文件时,则一定执行.2004年4月28一个简单的makefile文件z例如:

16、Makefile hello:a.o b.o gcc a.o b.o-o hello a.o:a.c gcc c a.c b.o:b.c gcc c b.cz当运行make时,可以接一目标名(eg:make hello)作为参数,表示要处理改目标。如没有参数,则处理第一个目标。z对上述例子执行make,则是处理hello这个目标。zhello依赖于文件目标a.o和b.o,则先去处理a.o,调用gcc c a.c来更新a.o,之后更新b.o,最后调用gcc a.c b.o-o hello 来更新hello2004年4月29Make中的宏(macro)z在make中是用宏,要先定义,然后在make

17、file中引用。宏的定义格式为:宏名=宏的值 (宏名一般习惯用大写字母)例:CC=gcc hello:a.o b.o$(CC)a.o b.o-o hello a.o:a.c$(CC)c a.c b.o:b.c$(CC)c b.c2004年4月30系统定义的宏z还有一些设定好的内部变量,它们根据每一个规则内容定义。y$当前规则的目的文件名y$依靠列表中的第一个依靠文件y$整个依靠的列表(除掉了里面所有重复的文件名)。y$?依赖中所有新于目标的z以用变量做许多其它的事情,特别是当你把它们和函数混合 使用的时候。如果需要更进一步的了解,请参考 GNU Make 手册。(man make,man ma

18、kefile)2004年4月31修改原先的makefile CC =gcc CFLAGS =-O2 OBJS =a.o b.o hello:$(OBJS)$(CC)$-o$a.o:a.c$(CC)$(CFLAGS)-c$b.o:b.c$(CC)$(CFLAGS)-c$clean:rm f*.o hello2004年4月32隐含规则z请注意在上面的例子里,几个产生.o文件的命令都是一样的,都是从.c文件和相关文件里产生.o文件,这是一个标准的步骤。z其实make已经知道怎么做它有一些叫做隐含规则的内置的规则,这些规则告诉它当你没有给出某些命令的时候,应该怎么办。z如果你把生成a.o和b.o的命令

19、从它们的规则中删除,make将会查找它的隐含规则,然后会找到一个适当的命令。z它的命令会使用一些变量,因此你可以按照你的想法来设定它:它使用变量CC做为编译器,并且传递变量CFLAGS,CPPFLAGS,TARGET_ARCH,然后它加入-c,后面跟变量$,然后是-o跟变量$。一个编译的具体命令将会是:$(CC)$(CFLAGS)$(CPPFLAGS)$(TARGET_ARCH)-c$1/fy实际上并行加速不仅受限于程序串行分量,还受并行程序运行时的额外开销影响s1/(f+Wo/W)zGustafson定律:适用于可扩放问题y很多大型计算,精度要求很高,而计算时间固定不变y为提高精度,必须加大

20、计算量,相应的必须增加处理器数yS=(Ws+pWp)/(WsWp)=f+p(1-f)=p+f(1-p)=p-f(p-1)zSun和Ni定律:受限于存储器y只要存储空间许可,应尽量增大问题规模以产生更好、更精确的解yS=(f+(1-f)G(p)/(f+(1-f)G(p)/p)G(p)=1:Amdahl;G(p)=p,Gustafson2004年4月100可扩放性z可扩放性(Scalability):确定的应用背景下,计算系统(或算法或编程等)的性能随着处理器的数目的增加而按比例的提高的能力z可扩放性时算法和结构的组合,研究可扩放性时,总是将并行算法和体系结构一并考虑y算法的可扩放性:该算法针对某

21、一特定机器的可扩放性y体系结构的可扩放性:该体系结构的机器的某一并行算法的可扩放性z一般情况下,增加处理器数,会增加额外开销和降低处理器利用率;所以对于一个特定的并行系统、并行算法或并行程序,它们能否有效的利用不断增加的处理器的能力应是受限的z研究可扩放性的目的y确定某类问题用哪种并行算法与哪种并行体系结构结合,可以有效地利用大量处理器y运行于某种体系结构的并行机上的某种算法,根据在小规模机器上的运行性能,预测在大规模机器上的性能y对固定的问题规模,确定最有的处理机数和加速比y指导改进算法、体系结构,以利用可扩充的大量处理器2004年4月101可扩放性评测标准z等效率度量标准:y若问题规模w不

22、变,随着处理器数P的增加会导致开销To随之增加,效率E下降。为了保持E不变,则在增加p的同时相应的增加问题规模W,以抵消由于p增加而导致的To的增加,从而保持效率不变y随着系统规模的增加(处理器数目的增加),测量增加多少运算量会保持效率不变y增加越少表明可扩放性越好yE1/(1+To/W)To:额外开销时间之和曲线1表示的算法具有很好的可扩放性,曲线2次之,曲线3最差2004年4月102可扩放性评测标准z等速度度量标准y系统规模增加时,若保持平均速度(每个处理器的速度)不变,每个处理器增加浮点操作的量y速度常以每秒多少次浮点运算(Flops)来表示z等计算时间/通信开销比率度量标准y系统规模增

23、加时,保持计/通比不变所需要增加的问题规模z计算时间/通信开销比率y并行计算时间与系统开销之比2004年4月103讲座主要内容提示z并行计算简介z编译环境z数学库z并行计算机体系结构z并行软件环境z并行计算机性能评测zMPI、PVM、OpenMP2004年4月104消息传递并行程序设计消息传递并行程序设计z消息传递并行程序设计消息传递并行程序设计y指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。y在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。y这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编

24、程方式。z并行计算粒度大,特别适合于大规模可扩展并行算法并行计算粒度大,特别适合于大规模可扩展并行算法y由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.z消息传递是当前并行计算领域的一个非常重要的并行程消息传递是当前并行计算领域的一个非常重要的并行程序设计方式序设计方式2004年4月105什么是什么是MPI?zMassagePassingInterface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和Cy一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进

25、行调用yMPI是一种标准或规范的代表,而不是特指某一个对它的具体实现yMPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准2004年4月106MPI的发展过程的发展过程z发展的两个阶段yMPI1.1:1995xMPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.yMPI1.22.0:动态进程,并行I/O,支持F90和C+(1997).2004年4月107为什么要用MPI?z高可移植性高可移植性yMPI已在IBMPC机上、MSWindows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递

26、的C或Fortran并行程序可不加改变地运行在IBMPC、MSWindows、Unix工作站、以及各种并行机上。2004年4月108从简单入手!z下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序Hello(下页).z该程序在终端打印出HelloWorld!字样.z“HelloWorld”:一声来自新生儿的问候.2004年4月109Helloworld(C)#include#include mpi.h“main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize()

27、;2004年4月110Helloworld(Fortran)program maininclude mpif.hinteger ierrcall MPI_INIT(ierr)print*,Hello,world!call MPI_FINALIZE(ierr)end2004年4月111C和和Fortran中中MPI函数约定函数约定zCy必须包含mpi.h.yMPI函数返回出错代码或MPI_SUCCESS成功标志成功标志.yMPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.zFortrany必须包含mpif.h.y通过子函数形式调用MPI,函数最后一个参数为返回值.yMPI-

28、前缀,且函数名全部为大写.zMPI函数的参数被标志为以下三种类型:yIN:参数在例程的调用中不会被修正.yOUT:参数在例程的调用中可能会被修正.yINOUT:参数在一些例程中为IN,而在另一些例程中为OUT.2004年4月112MPI初始化-MPI_INITintMPI_Init(int*argc,char*argv)MPI_INIT(IERROR)yMPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。y启动MPI环境,标志并行代码的开始.y并行代码之前,第一个mpi函数(除MPI_Initialize()外).y要求m

29、ain必须带参数运行,否则出错.2004年4月113MPI结束-MPI_FINALIZEintMPI_Finalize(void)MPI_FINALIZE(IERROR)yMPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。y标志并行代码的结束,结束除主进程外其它进程.y之后串行代码仍可在主进程(rank=0)上运行(如果必须)2004年4月114MPI程序的的编译与运行zmpif77hello.f或mpicchello.cy默认生成a.out的可执行代码.zmpif77ohellohello.f或zm

30、piccohellohello.cy生成hello的可执行代码.zmpirunnp4a.outzmpirunnp4helloy4指定np的实参,表示进程数,由用户指定.ya.out/hello要运行的MPI并行程序.%小写o%np:Thenumberofprocess.2004年4月115:运行我们的MPI程序!zserver0czn17:mpicc-ohellohello.czserver0czn18:./hello()0Abortingprogram!Couldnotcreatep4procgroup.Possiblemissingfileorprogramstartedwithoutmp

31、irun.zserver0czn19:mpirun-np4hello()HelloWorld!HelloWorld!HelloWorld!HelloWorld!zserver0czn20:计算机打印字符我们输入的命令2004年4月116:Hello是如何被执行的?zSPMD:SingleProgramMultipleData(MIMD):#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();#include mpi.h#include m

32、ain(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();HelloW

33、orld!HelloWorld!HelloWorld!HelloWorld!#include mpi.h#include main(int argc,char*argv)MPI_Init(&argc,&argv);printf(Hello,world!n);MPI_Finalize();2004年4月117:开始写MPI并行程序z在写MPI程序时,我们常需要知道以下两个问题的答案:y任务由任务由多少多少个进程来进行并行计算?个进程来进行并行计算?y我是我是哪一个哪一个进程进程?2004年4月118:开始写MPI并行程序zMPI提供了下列函数来回答这些问题:y用用MPI_Comm_size获得进

34、程个数pintMPI_Comm_size(MPI_Commcomm,int*size);y用用MPI_Comm_rank获得进程的一个叫rank的值,该rank值为0到p-1间的整数,相当于进程的IDintMPI_Comm_rank(MPI_Commcomm,int*rank);2004年4月119更新的HelloWorld(c)#include#include mpi.hmain(int argc,char*argv)int myid,numprocs;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_siz

35、e(MPI_COMM_WORLD,&numprocs);printf(“I am%d of%dn,myid,numprocs);MPI_Finalize();2004年4月120更新的HelloWorld(Fortran)program maininclude mpif.hinteger ierr,myid,numprocscall MPI_INIT(ierr)call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)print*,I am,myid,of,numpro

36、cscall MPI_FINALIZE(ierr)end2004年4月121:运行结果zserver0czn22:mpiccohello1hello1.czserver0czn23:mpirun-np4hello1Iam0of4Iam1of4Iam2of4Iam3of4zserver0czn24:计算机打印字符我们输入的命令2004年4月122有消息传递greetings(c)#include#includempi.hmain(intargc,char*argv)intnumprocs,myid,source;MPI_Statusstatus;charmessage100;MPI_Init(&

37、argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);2004年4月123有消息传递greetings(c)if(myid!=0)strcpy(message,HelloWorld!);MPI_Send(message,strlen(message)+1,MPI_CHAR,0,99,MPI_COMM_WORLD);else/*myid=0*/for(source=1;sourcenumprocs;source+)MPI_Recv(message,100,MPI_CHAR,s

38、ource,99,MPI_COMM_WORLD,&status);printf(%sn,message);MPI_Finalize();/*endmain*/2004年4月124Greeting执行过程2004年4月125解剖greetings程序z头文件:mpi.h/mpif.h.zint MPI_Init(int*argc,char*argv)y启动MPI环境,标志并行代码的开始.y并行代码之前,第一个mpi函数(除MPI_Initialize()外).y要求main必须带能运行,否则出错.z通信子(通信空间):MPI_COMM_WORLD:y一个通信空间是一个进程组和一个上下文的组合.上

39、下文可看作为组的超级标签,用于区分不同的通信子.y在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信子即被写作MPI_COMM_WORLD.y该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.2004年4月126解剖greetings程序zint MPI_Comm_size(MPI_Comm comm,int*size)y获得通信空间comm中规定的组包含的进程的数量.y指定一个communicator,也指定了一组共享该空间的进程,这些进程组成该communicator的group.zint MPI_Comm_rank(MPI_Co

40、mm comm,int*rank)y得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始).zint MPI_Finalize()y标志并行代码的结束,结束除主进程外其它进程.y之后串行代码仍可在主进程(rank=0)上运行(如果必须).2004年4月127消息传送(先可不关心参数含义)MPI_Send(A,10,MPI_DOUBLE,1,99,MPI_COMM_WORLD);MPI_Recv(B,20,MPI_DOBULE,0,99,MPI_COMM_WORLD,&status);数据传送数据传送+同步操作同步操作l需要发送方与接收方合作完成.DataProcess 0Proce

41、ss 1发送请求YesDataDataDataDataDataDataDataDataTime2004年4月128MPI程序的编译zmpicc编译并连接用C语言编写的MPI程序zmpiCC编译并连接用C+编写的MPI程序zmpif77编译并连接用FORTRAN77编写的MPI程序zmpif90编译并连接用Fortran90编写的MPI程序z这些命令可以自动提供MPI需要的库,并提供特定的开关选项(用-help查看)2004年4月129MPI程序的编译z用mpicc编译时,就像用一般的C编译器一样。还可以使用一般的C的编译选项,含义和原来的编译器相同z例如:./mpicc-c foo.c./mp

42、icc-o foo foo.o2004年4月130MPI程序的运行zMPI程序的执行步骤一般为:y编译以得到MPI可执行程序(若在同构的系统上,只需编译一次;若系统异构,则要在每一个异构系统上都对MPI源程序进行编译)z将可执行程序拷贝到各个节点机上z通过mpirun命令并行执行MPI程序2004年4月131最简单的MPI运行命令mpirunnpN其中:N:同时运行的进程数:可执行MPI程序名例如:mpirunnp6cpimpirunnp4hello2004年4月132一种灵活的执行方式mpirun p4pg z为配置文件,其格式为:为配置文件,其格式为:z例如例如:(注:第一行的注:第一行的

43、0并不表示在并不表示在node0上没有进程,这上没有进程,这里的里的0特指在特指在node0上启动上启动MPI程序程序)node0 0/public0/czn/mpi/cpinode1 1/public0/czn/mpi/cpinode2 1/public0/czn/mpi/cpiz这种方式允许可执行程序由不同的名字和不同的路径这种方式允许可执行程序由不同的名字和不同的路径2004年4月133完整的MPI运行方式zMPI程序的一般启动方式:程序的一般启动方式:mpirunnpz完整的完整的MPI运行方式:运行方式:mpirunmpirun_optionsoptions详细参数信息执行mpiru

44、n-help2004年4月134曙光4000L:MPI-BCLzMPI-BCL:为曙光4000l优化的MPI通信库,和基于TCP/IP的网络版MPICH1.2(三层结构)APIADI:AbstractDeviceInterface各种不同的底层通信库的不同接口的统一标准(相当于某一种底层通信库)MPI-BCL:MPI-BasicCommunicationLibrary具体的底层通信库PointtopointCollective移植:根据不同的device(即平台或底层通信)实现不同的ADI接口2004年4月135曙光4000L:runzrun-h|help|-?-sz|-sz-pn-np-pl

45、-cpuprogramy-h|help|-?得到run的帮助信息,需要帮助时用y-sz指定物理节点数,默认与np数相等,可忽略,xrunsz4np8a.out表示在4个物理节点上运行a.out的8个进程y-sz指定物理节点的长和宽,选定mesh结构,xrunsz4X4a.out表示在一个4*4的mesh结构上组织通信y-np指定进程数y-on指定物理节点列表xrunonnode0.3a.out表示在节点0,1,2,3上运行a.outy-pl指定节点池名p1,p2,默认为p1/(0-15)y-cpu载入要执行程序的cpu模式ep独占通讯端口,-en独占节点yprogram要执行程序名以及其参数z

46、常用形式:常用形式:run np 4 a.out2004年4月136PVM(Parallel Virtual Machine)z开发时间:始于1989年z开发单位:美国橡树岭(Oak Ridge)国家实验室、美国Tennessee大学和Emory大学联合研制z特点:具有较好的适应性、可扩展性、可移植性和易使用性等特点,源代码可以免费获取,现已被用户广泛采纳。z现状:目前对它的研究和开发工作仍在各大学和研究机构进行.随着它的不断流行,已经被移植到PVP、SMP、MPP、工作站和机群系统。zPVM出现的时间较MPI早,且是一个自包含系统(MPI不是自包含的),同时PVM不是一个标准(MPI是个标准

47、)。目前,PVM和MPI正在互相靠拢。2004年4月137PVM概貌概貌PVMPVM系统的组成系统的组成(两部分两部分):PVM监控进程(Daemon Process),称为pvmd,它常驻在虚拟机的每一台节点机上。PVM可调用的库,称为libpvm3.a,它与用户的应用程序链接,用于进程管理,消息传递和虚拟机管理。在PVM中,节点(a node)称为主机(a host).进程(aprocess)称为任务(a task).并行虚拟机的组成并行虚拟机的组成1多台主机(硬件)唯一1个master pvmd,运行在称为控制台的主机上0多个slave pvmd2004年4月138共享存储并行机模型体系

48、结构特点体系结构特点:多台处理机通过互联网络共享一个统一的内存空间,通过单一内存地址单一内存地址来实现处理机间的协调.内存空间也可由多个存储器模块构成.每台处理机可以执行相同或不同的指令流,每台处理机可以直接访问到所有数据.处理机间通信是借助于共享主存来通信是借助于共享主存来实现的实现的.可扩展性差,当处理机需要同时访问共享全局变量时,产生内存竞争现象而严重影响效率,比较适合中小规模应用问题的计算和事务处理.2004年4月139共享存储编程标准与特点z共享存储器编程标准yPthreads(线程标准)yX3H5(线程标准)yOpenMP(最常用的共享存储并行编程方式,是我们讨论的重点.)z共享存

49、储器编程特点y显式多线程库调用.(Pthreads).y编译制导语句,OpenMP等.z语言yC,Fortran77,Fortran90/95,C+2004年4月140与X3H5的关系zX3H5是ANSI/X3授权的小组委员会,主要目的是在PCF(theParallelComputingForum)工作的基础上,发展并行计算的一个ANSI标准.PCF是一非正式的工业组织,虽在DO循环的并行化方法的标准化方面做一些工作,但在起草拟了一个标准后就草草收场zOpenMP专门针对这类并行化问题,并完成了这项工作,同时得到工业界的广泛支持2004年4月141ANSIX3H5共享编程标准z概念性的编程模型

50、(ANSI标准(1993)y没有任何商品化的共享存储器系统依附于X3H5,但X3H5的基本概念影响以后共享存储器系统的并行编程.(一些基本概念在OpenMP均出现!)zX3H5支持C,Fortran77以及Fortran90语言.zX3H5规定的基本的并行结构用于并行性表述:y并行块(分散任务WorkSharing)y并行循环y单进程parallel end parallelpsections end psectionspdoend pdopsingleend psingle2004年4月142X3H5编程实例programmain!程序以顺序模式执行A!A只由基本线程执行parallel!转

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

当前位置:首页 > 教育专区 > 高考资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁