并行计算简介PPT课件_第1页
并行计算简介PPT课件_第2页
并行计算简介PPT课件_第3页
并行计算简介PPT课件_第4页
并行计算简介PPT课件_第5页
已阅读5页,还剩144页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2004年4月1/1492004.42004年4月2/149讲座主要内容提示z并行计算简介z编译环境z数学库z并行计算机体系结构z并行软件环境z并行计算机性能评测zMPI 、PVM、OpenMP2004年4月3/149并行计算-高性能计算 并行计算并行计算(Parallel Computing) 高端计算高端计算(High-end Parallel Computing) 高性能计算高性能计算(High Performance Computing) 超级计算超级计算(Super Computing)任何高性能计算和超级计算都离不开使用并行技术任何高性能计算和超级计算都离不开使用并行技术 计算科学

2、计算科学与传统的两种科学,即与传统的两种科学,即理论科学理论科学和和实验科学实验科学,并,并立被认为是人类认识自然的三大支柱,他们彼此相辅相成立被认为是人类认识自然的三大支柱,他们彼此相辅相成地推动科学发展与社会进步。在许多情况下,或者是理论地推动科学发展与社会进步。在许多情况下,或者是理论模型复杂甚至理论尚未建立,或者实验费用昂贵甚至无法模型复杂甚至理论尚未建立,或者实验费用昂贵甚至无法进行时,计算就成了求解问题的唯一或主要的手段。进行时,计算就成了求解问题的唯一或主要的手段。2004年4月4/149并行:古老的思想!“.并行计算并不是什么新的思想并行计算并不是什么新的思想,只只是将它扩展应

3、用于计算机而已是将它扩展应用于计算机而已”. 作者也不认为这种扩展应用会存在什么无法克服的困难. 但也不要期待有效的并行编程方法与技术能够在一夜之间诞生. 期间还需要有许多的工作和实验要做. 毕竟, 今天的编程技术(串行)是若干年来艰苦的探索才取得的. 现在编程工作似乎成了一种令人单调乏味的工作,事实上,并行编程的出现将会使重新恢复编程工作者们的探索精神 .” (Gill, S. (1958), “Parallel Programming” The Computer Journal, vol. 1, April, pp. 2-10.)Parallel Programming with MPIb

4、y Peter Pacheco(2000)2004年4月5/149什么是并行计算?z 并行计算并行计算: 由运行在多个部件上的小任务合作来求解一个规模很大的计算问题的一种方法z 例: 在曙光2000上用8个节点计算的Mandelbrot集结果(Mandelbrot为分形理论创始人)czzii212004年4月6/149现代计算机的共同特点: 并行性2004年4月7/149现代计算机的共同特点: 并行性2004年4月8/149为什么要做并行计算? 应用需求2004年4月9/149为什么要做并行计算?人类对计算及性能的要求是无止境的从系统的角度:集成系统资源,以满足不断增长的对性能和功能的要求从应

5、用的角度:适当分解应用,以实现更大规模或更细致的计算2004年4月10/149为什么要做并行计算? 问题: 科学和工程问题的数值模拟与仿真 计算密集 数据密集 网络密集 三种混合 要求:在合理的时限内完成计算任务 秒级制造业 分钟级短时天气预报(当天) 小时级中期天气预报(310日) 尽可能快长期天气预报(气候) 可计算湍流模拟2004年4月11/149全球气候变化图1-1系统速度天气预报72小时油藏建模机翼设计物体特性分析年后19951991198019881993存储器容量48结构生物学药物设计化学动力学1000GB100GB10GB1GB100MB10MB小时天气预报100Mflops1

6、Gflops10Gflops100Gflops1Tflops人类基因湍流飞行动力学海洋环流粘滞流体动力学超导建模半导体建模视觉量子染色动力学3维等离子体建模2004年4月12/149并行计算的功能z降低单个问题求解的时间z增加问题求解规模、提高问题求解精度z(多机同时执行多个串行程序)容错、更高的可用性、提高吞吐率2004年4月13/149如何实现并行计算?分而治之!2004年4月14/149分而治之z并行化的主要方法并行化的主要方法: :分而治之分而治之y根据问题的求解过程,把任务分成若干子任务(任务级并行或功能并行)y根据处理数据的方式,形成多个相对独立的数据区,由不同的处理器分别处理(数

7、据并行)2004年4月15/149讲座主要内容提示z并行计算简介z编译环境y常用编译器y编译优化y如何编译z数学库z并行计算机体系结构z并行软件环境z并行计算机性能评测zMPI 、PVM、OpenMP2004年4月16/149GNU CompilerzGNU Compilery自由软件,一般操作系统都自带y支持C/C+、Fortran77、Java、COBAL等等许多语言y支持大部分硬件平台y高性能计算中常用的:xC/C+:GCC (GNU C/C+ Compiler)xFortran 77:G77x不支持Fortran 90/ 95x不支持OpenMPy是最常用的编译器,性能一般(相对于一些

8、针对特定平台优化的编译器)y由于缺少对Fortran 90/ 95,限制了其在高性能计算中的使用2004年4月17/149PGI CompilerzPGI Compilery由Portland公司开发的编译器y支持AMD Opteron/Althon处理器、Intel Xeon处理器等,在Opteron上同时支持32-bit和64-bit()y支持Linux、Windowsy支持C/C+(pgcc)、Fortran77(pgf77)、Fortran90/95(pgf90)、HPF(High Performance Fortran)y支持多线程和OpenMPy最新版本:5.1y需要购买,但可以从

9、网上得到15天试用版本 http:/ 2004年4月18/149Intel CompilerzIntel Compilery由Intel公司针对Intel处理器开发(Xeon、Pentium)y支持Linux、Windowsy支持C/C+(icc:Intel C/C+ Compiler)、Fortran77/90/95(ifc: Intel Fortran Compiler)y支持多线程和OpenMPy最新版本:8.0y需要购买,但可以从网上得到30天试用版本 http:/ 2004年4月19/149编译优化z 编译优化对于计算密集型程序的性能提高非常帮助z 优化消耗CPU资源最多的那部分,即

10、计算密集部分z 一般采用-O2、-O3z 可以采用SIMD指令集,eg: Intel和AMD处理器的MMX、SSE1、SSE2z 具体编译优化的选项和编译器以及CPU相关,参见编译器手册z 对于有些应用程序,过分的优化会导致计算结果错误2004年4月20/149编译优化在双路Intel Xeon平台上,采用SSE2优化和不采用SSE2优化,所获得的HPL性能。在这种情况下,采用SSE2技术得到的性能高出近90 0.00.51.01.52.02.53.02000400080001200014000问题规模问题规模峰值(GFlops)峰值(GFlops)Without SSE2With SSE22

11、004年4月21/149编译简介z在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件z大部分编译器通过后缀来区别输入文件的类别,下面来介绍常用的一些后缀y.c:C语言源代码文件y.f:Fortran 77语言源代码文件y.o:编译后的目标文件y.a:由目标文件构成的档案库文件y.C、.cc、.cxx:C+源代码文件y.f90:Fortran 90语言源代码文件y.h:程序所包含的头文件2004年4月22/149基本的用法cc/f77/f90 options filenames 编译器名 编译参数 编译文件其中options就是编译器所需要的参数,fil

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

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

14、用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。2004年4月25/149常用编译参数z -Ldirname:将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。z -lname

15、:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。 上面我们简要介绍了编译器最常用的功能和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。2004年4月26/149GCC应用举例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 hel

16、lo hello.o生成hello6. gcc c hello1.c生成hello1.o gcc c hello2.c生成hello2.o gcc o hello hello1.o hello2.o 生成hello7. gcc o test test1.o lm I/home/czn/include2004年4月27/149Make简介z 在开发大系统时,经常要将程序划分为许多模块。各个模块之间存在着各种各样的依赖关系,在Linux中通常使用 Makefile来管理y由于各个模块间不可避免存在关联,所以当一个模块改动后,其他模块也许会有所更新,当然对小系统来说,手工编译连接是没问题,但是如果是

17、一个大系统,存在很多个模块,那么手工编译的方法就不适用了。y为此,在Linux系统中,专门提供了一个make命令来自动维护目标文件。y与手工编译和连接相比,make命令的优点在于他只更新修改过的文件,而对没修改的文件则置之不理,并且make命令不会漏掉一个需要更新的文件2004年4月28/149一个简单的例子z先举一个例子: a.c b.c两个程序a.c extern void p(char *); main() p(hello world); b.c void p(char *str) printf(%sn,str); z Makefile hello: a.c b.c gcc a.c b.

18、c -o hello 注意这里是一个Tab z 执行makegcc a.c b.c -o hello 产生一个叫hello的可执行程序2004年4月29/149书写makefile文件z Makefile时由规则来组成的,每一条规则都有三部分组成:目标(object),依赖(dependency)和命令(command).在上面的例子中, Makefile只有一条规则,其目标为hello,期依赖为a.c b.c,其命令为gcc a.c b.c -o helloz 依赖可以是另一条规则的目标,也可以是文件.每一条规则被这样处理.如目标是一个文件是:当它的依赖是文件时,如果依赖的时间比目标要新,

19、则运行规则所包含的命令来更新目标; 如果依赖是另一个目标则用同样的方法先来处理这个目标.如目标不是一个存在的文件时,则一定执行.2004年4月30/149一个简单的makefile文件z 例如: 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这个目标。z hello依赖于文件目标a.o和b.o,则先去处理a.o

20、,调用gcc c a.c来更新a.o,之后更新b.o,最后调用gcc a.c b.o -o hello 来更新hello2004年4月31/149Make中的宏(macro)z 在make中是用宏,要先定义,然后在makefile中引用。宏的定义格式为: 宏名 = 宏的值 (宏名一般习惯用大写字母)例: 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月32/149系统定义的宏z 还有一些设定好的内部变量,它们根据每一个规则内容定义。y$ 当前规则的目的文

21、件名y$ 依靠列表中的第一个依靠文件y$ 整个依靠的列表(除掉了里面所有重复的文件名)。y$? 依赖中所有新于目标的z 以用变量做许多其它的事情,特别是当你把它们和函数混合 使用的时候。如果需要更进一步的了解,请参考 GNU Make 手册。 (man make, man makefile)2004年4月33/149修改原先的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 $ clea

22、n:rm f *.o hello2004年4月34/149隐含规则z 请注意在上面的例子里,几个产生.o文件的命令都是一样的,都是从.c文件和相关文件里产生.o文件,这是一个标准的步骤。z 其实make已经知道怎么做它有一些叫做隐含规则的内置的规则,这些规则告诉它当你没有给出某些命令的时候,应该怎么办。z 如果你把生成a.o和b.o的命令从它们的规则中删除,make将会查找它的隐含规则,然后会找到一个适当的命令。z 它的命令会使用一些变量,因此你可以按照你的想法来设定它:它使用变量CC做为编译器,并且传递变量CFLAGS,CPPFLAGS,TARGET_ARCH,然后它加入 -c ,后面跟变量

23、$,然后是 -o跟变量$。一个编译的具体命令将会是: $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $1/fy实际上并行加速不仅受限于程序串行分量,还受并行程序运行时的额外开销影响 s1/(f+Wo/W)z Gustafson定律:适用于可扩放问题y很多大型计算,精度要求很高,而计算时间固定不变y为提高精度,必须加大计算量,相应的必须增加处理器数yS=(Ws+pWp)/(WsWp)=f+p(1-f)=p+f(1-p)=p-f(p-1)z Sun和Ni定律:受限于存储器y只要存储空间许可,应尽量增大问题规模以产生更好、更精确的解yS=(f+(1-f)

24、G(p)/(f+(1-f)G(p)/p) G(p)=1 :Amdahl; G(p)=p,Gustafson2004年4月102/149可扩放性z 可扩放性(Scalability): 确定的应用背景下,计算系统(或算法或编程等)的性能随着处理器的数目的增加而按比例的提高的能力z 可扩放性时算法和结构的组合,研究可扩放性时,总是将并行算法和体系结构一并考虑y算法的可扩放性: 该算法针对某一特定机器的可扩放性y体系结构的可扩放性: 该体系结构的机器的某一并行算法的可扩放性z 一般情况下,增加处理器数,会增加额外开销和降低处理器利用率;所以对于一个特定的并行系统、并行算法或并行程序,它们能否有效的利

25、用不断增加的处理器的能力应是受限的z 研究可扩放性的目的y确定某类问题用哪种并行算法与哪种并行体系结构结合,可以有效地利用大量处理器y运行于某种体系结构的并行机上的某种算法,根据在小规模机器上的运行性能,预测在大规模机器上的性能y对固定的问题规模,确定最有的处理机数和加速比y指导改进算法、体系结构,以利用可扩充的大量处理器2004年4月103/149可扩放性评测标准z 等效率度量标准: y若问题规模w不变,随着处理器数P的增加会导致开销To随之增加,效率E下降。为了保持E不变,则在增加p的同时相应的增加问题规模W,以抵消由于p增加而导致的To的增加,从而保持效率不变y随着系统规模的增加(处理器

26、数目的增加) ,测量增加多少运算量会保持效率不变y增加越少表明可扩放性越好yE1/(1+To/W) To: 额外开销时间之和工作负载 W工作负载 W处理器数 P处理器数 P曲线1曲线1曲线 2曲线 2曲线 3曲线 3曲线1表示的算法具有很好的可扩放性,曲线2次之,曲线3最差2004年4月104/149可扩放性评测标准z等速度度量标准y系统规模增加时,若保持平均速度(每个处理器的速度)不变,每个处理器增加浮点操作的量y速度常以每秒多少次浮点运算(Flops)来表示z等计算时间/通信开销比率度量标准y系统规模增加时,保持计/通比不变所需要增加的问题规模z计算时间/通信开销比率y并行计算时间与系统开

27、销之比2004年4月105/149讲座主要内容提示z并行计算简介z编译环境z数学库z并行计算机体系结构z并行软件环境z并行计算机性能评测zMPI、PVM、OpenMP2004年4月106/149消息传递并行程序设计消息传递并行程序设计z消息传递并行程序设计消息传递并行程序设计y指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。y在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。y这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。z 并行计算粒度大,特别适合于大规模可扩展并行算法并行计算粒度大

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

29、它的具体实现yMPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准2004年4月108/149MPI的发展过程的发展过程z发展的两个阶段yMPI 1.1: 1995xMPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.yMPI 1.22.0:动态进程, 并行 I/O, 支持F90和C+(1997).2004年4月109/149为什么要用MPI?z高可移植性高可移植性yMPI已在IBM PC机上、MS Windows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行

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

31、world!n ); MPI_Finalize();2004年4月112/149Hello world(Fortran)program maininclude mpif.hinteger ierrcall MPI_INIT( ierr )print *, Hello, world!call MPI_FINALIZE( ierr )end2004年4月113/149C和和Fortran中中MPI函数约定函数约定z Cy必须包含mpi.h.yMPI 函数返回出错代码或 MPI_SUCCESS成功标志成功标志.yMPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.z Fortra

32、ny必须包含mpif.h.y通过子函数形式调用MPI,函数最后一个参数为返回值.yMPI-前缀,且函数名全部为大写.z MPI函数的参数被标志为以下三种类型:yIN:参数在例程的调用中不会被修正.yOUT:参数在例程的调用中可能会被修正.yINOUT:参数在一些例程中为IN,而在另一些例程中为OUT.2004年4月114/149MPI初始化-MPI_INITint MPI_Init(int *argc, char *argv)MPI_INIT(IERROR)yMPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。y启动MPI

33、环境,标志并行代码的开始.y并行代码之前,第一个mpi函数(除MPI_Initialize()外).y要求main必须带参数运行,否则出错.2004年4月115/149MPI结束-MPI_FINALIZEint MPI_Finalize(void)MPI_FINALIZE(IERROR)yMPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。y标志并行代码的结束,结束除主进程外其它进程.y之后串行代码仍可在主进程(rank = 0)上运行(如果必须)2004年4月116/149MPI程序的的编译与运行zm

34、pif77 hello.f 或 mpicc hello.c y默认生成a.out的可执行代码.zmpif77 o hello hello.f 或zmpicc o hello hello.cy生成hello的可执行代码.zmpirun np 4 a.outzmpirun np 4 helloy4 指定np的实参,表示进程数,由用户指定.ya.out / hello 要运行的MPI并行程序.%小写o%np:The number of process.2004年4月117/149:运行我们的MPI程序!z server0czn17: mpicc -o hello hello.cz server0cz

35、n18: ./hello ( ) 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun.z server0czn19: mpirun -np 4 hello ( ) Hello World! Hello World! Hello World! Hello World!z server0czn20:计算机打印字符我们输入的命令2004年4月118/149:Hello是如何被执行的?zSPMD: Single Program Multipl

36、e Data(MIMD) :#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();#include mpi.h#include main( int

37、 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();Hello World!Hello World!Hello World!Hello World!#include mpi.h#include main( i

38、nt argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();2004年4月119/149:开始写MPI并行程序z在写MPI程序时,我们常需要知道以下两个问题的答案:y任务由任务由多少多少个进程来进行并行计算?个进程来进行并行计算?y我是我是哪一个哪一个进程进程? 2004年4月120/149:开始写MPI并行程序zMPI 提供了下列函数来回答这些问题:y用用MPI_Comm_size 获得进程个数 p int MPI_Comm_size(MPI_Comm com

39、m, int *size);y用用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的IDint MPI_Comm_rank(MPI_Comm comm, int *rank);2004年4月121/149更新的Hello World(c)#include #include mpi.hmain( int argc, char *argv ) int myid, numprocs; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &myid ); MPI

40、_Comm_size( MPI_COMM_WORLD, &numprocs ); printf(“I am %d of %dn, myid, numprocs ); MPI_Finalize();2004年4月122/149更新的Hello World(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, nu

41、mprocs, ierr )print *, I am, myid, of, numprocscall MPI_FINALIZE( ierr )end2004年4月123/149:运行结果zserver0czn22: mpicc o hello1 hello1.czserver0czn23: mpirun -np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4zserver0czn24:计算机打印字符我们输入的命令2004年4月124/149有消息传递 greetings(c)#include #include mpi.hmain(in

42、t argc, char* argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); MPI_Comm_size(MPI_COMM_WORLD, &numprocs);2004年4月125/149有消息传递 greetings(c) if (myid != 0) strcpy(message, Hello World!); MPI_Send(message,s

43、trlen(message)+1, MPI_CHAR, 0,99, MPI_COMM_WORLD); else /* myid = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, &status); printf(%sn, message); MPI_Finalize(); /* end main */2004年4月126/149Greeting执行过程进程 0进程 0rank=0rank=0. . .Send()Se

44、nd(). . . .进程 1进程 1rank=1rank=1进程 2进程 2rank=2rank=2进程 3进程 3rank=3rank=3. . .Send()Send(). . . . . .Send()Send(). . . . . .Recv()Recv(). . . .2004年4月127/149解剖greetings程序z 头文件: mpi.h/mpif.h.z int MPI_Init(int *argc, char *argv) y启动MPI环境,标志并行代码的开始.y并行代码之前,第一个mpi函数(除MPI_Initialize()外).y要求main必须带能运行,否则出错

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

46、了一组共享该空间的进程, 这些进程组成该communicator的group.z int MPI_Comm_rank ( MPI_Comm comm, int *rank ) y得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始).z int MPI_Finalize() y标志并行代码的结束,结束除主进程外其它进程.y之后串行代码仍可在主进程(rank = 0)上运行(如果必须).2004年4月129/149消息传送(先可不关心参数含义)MPI_Send(A, 10, MPI_DOUBLE, 1,99, MPI_COMM_WORLD);MPI_Recv(B, 20, MPI_D

47、OBULE, 0, 99, MPI_COMM_WORLD, &status);数据传送数据传送 + 同步操作同步操作l需要发送方与接收方合作完成.DataProcess 0Process 1发送请求YesDataDataDataDataDataDataDataDataTime2004年4月130/149MPI程序的编译zmpicc编译并连接用C语言编写的MPI程序zmpiCC编译并连接用C+编写的MPI程序zmpif77编译并连接用FORTRAN 77编写的MPI程序zmpif90编译并连接用Fortran 90编写的MPI程序z这些命令可以自动提供MPI需要的库,并提供特定的开关选项

48、(用-help查看)2004年4月131/149MPI程序的编译z用mpicc编译时,就像用一般的C编译器一样。还可以使用一般的C的编译选项,含义和原来的编译器相同z例如:./mpicc -c foo.c./mpicc -o foo foo.o2004年4月132/149MPI程序的运行zMPI程序的执行步骤一般为:y编译以得到MPI可执行程序(若在同构的系统上,只需编译一次;若系统异构,则要在每一个异构系统上都对MPI源程序进行编译)z将可执行程序拷贝到各个节点机上z通过mpirun命令并行执行MPI程序2004年4月133/149最简单的MPI运行命令mpirun np N 其中:N: 同

49、时运行的进程数: 可执行MPI程序名例如:mpirun np 6 cpimpirun np 4 hello2004年4月134/149一种灵活的执行方式mpirun p4pg z为配置文件,其格式为:为配置文件,其格式为: z 例如例如: (注:第一行的注:第一行的0并不表示在并不表示在node0上没有进程,这上没有进程,这里的里的0特指在特指在node0上启动上启动MPI程序程序)node0 0 /public0/czn/mpi/cpinode1 1 /public0/czn/mpi/cpinode2 1 /public0/czn/mpi/cpiz 这种方式允许可执行程序由不同的名字和不同的

50、路径这种方式允许可执行程序由不同的名字和不同的路径2004年4月135/149完整的MPI运行方式zMPI程序的一般启动方式:程序的一般启动方式:mpirun np z完整的完整的MPI运行方式:运行方式:mpirun mpirun_options options详细参数信息执行mpirun -help2004年4月136/149曙光4000L: MPI-BCLzMPI-BCL:为曙光4000l优化的MPI通信库,和基于TCP/IP的网络版MPICH1.2 (三层结构)APIADI:Abstract Device Interface各种不同的底层通信库的不同接口的统一标准(相当于某一种底层通信

51、库)MPI-BCL:MPI-Basic Communication Library具体的底层通信库Point to pointCollective移植:根据不同的device(即平台或底层通信)实现不同的ADI接口2004年4月137/149曙光4000L: runz run -h|help|-? -sz |-sz -pn -np -pl -cpu program y-h|help|-? 得到run的帮助信息,需要帮助时用y-sz 指定物理节点数,默认与np数相等,可忽略,xrun sz 4 np 8 a.out 表示在4个物理节点上运行a.out的8个进程y-sz 指定物理节点的长和宽,选定

52、mesh结构,xrun sz 4X4 a.out表示在一个4*4的mesh结构上组织通信y-np 指定进程数y-on 指定物理节点列表xrun on node0.3 a.out 表示在节点0,1,2,3上运行a.outy-pl 指定节点池名p1,p2,默认为p1/(0-15)y-cpu 载入要执行程序的cpu模式 ep独占通讯端口,-en独占节点yprogram 要执行程序名以及其参数z 常用形式:常用形式:run np 4 a.out2004年4月138/149PVM(Parallel Virtual Machine)z 开发时间: 始于1989年z 开发单位: 美国橡树岭(Oak Ridg

53、e)国家实验室、美国Tennessee大学和Emory大学联合研制z 特点: 具有较好的适应性、可扩展性、可移植性和易使用性等特点, 源代码可以免费获取, 现已被用户广泛采纳。z 现状: 目前对它的研究和开发工作仍在各大学和研究机构进行. 随着它的不断流行, 已经被移植到PVP、SMP、MPP、工作站和机群系统。z PVM出现的时间较MPI早,且是一个自包含系统(MPI不是自包含的),同时PVM不是一个标准(MPI是个标准)。目前,PVM和MPI正在互相靠拢。2004年4月139/149PVM概貌概貌PVMPVM系统的组成系统的组成( (两部分两部分) ):PVM监控进程(Daemon Pro

54、cess), 称为pvmd, 它常驻在虚拟机的每一台节点机上。PVM可调用的库, 称为libpvm3.a, 它与用户的应用程序链接, 用于进程管理, 消息传递和虚拟机管理。在PVM中, 节点(a node)称为主机(a host). 进程(aprocess)称为任务(a task). 并行虚拟机的组成并行虚拟机的组成1多台主机(硬件)唯一1个master pvmd, 运行在称为控制台的主机上0多个slave pvmd2004年4月140/149共享存储并行机模型体系结构特点体系结构特点:多台处理机通过互联网络共享一个统一的内存空间,通过单一内存地址单一内存地址来实现处理机间的协调.内存空间也可

55、由多个存储器模块构成.每台处理机可以执行相同或不同的指令流,每台处理机可以直接访问到所有数据.处理机间通信是借助于共享主存来通信是借助于共享主存来实现的实现的.可扩展性差,当处理机需要同时访问共享全局变量时,产生内存竞争现象而严重影响效率,比较适合中小规模应用问题的计算和事务处理.2004年4月141/149共享存储编程标准与特点z共享存储器编程标准yPthreads(线程标准) yX3H5(线程标准)yOpenMP(最常用的共享存储并行编程方式,是我们讨论的重点.)z共享存储器编程特点y显式多线程库调用.(Pthreads).y编译制导语句,OpenMP等.z语言yC,Fortran77,Fortran90/95,C+2004年4月142/149与X3H5的关系z X3H5是ANSI/X3授权的小组委员会,主要目的是在PCF(the Parallel Computing Forum)工作的基础上,发展并行计算的一个ANSI标准. PCF是一非正式的工业组织,虽在DO循环的并行化方法的标准化方面做一些工作,但在起草拟了一个标准后就草草收场z OpenMP专门针对这类并行化问题,并完成了这项工作,同时得到工业

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论