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

下载本文档

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

文档简介

1、并行计算简介高性能事业部:曹振南 2004.42004年4月1讲座主要内容提示并行计算简介编译环境数学库并行计算机体系结构并行软件环境并行计算机性能评测MPI 、PVM、OpenMP2004年4月2并行计算-高性能计算并行计算(Parallel Computing) 高端计算(High-end Parallel Computing) 高性能计算(High Performance Computing) 超级计算(Super Computing)任何高性能计算和超级计算都离不开使用并行技术计算科学与传统的两种科学,即理论科学和实验科学,并立被认为是人类认识自然的三大支柱,他们彼此相辅相成地推动科学

2、发展与社会进步。在许多情况下,或者是理论模型复杂甚至理论尚未建立,或者实验费用昂贵甚至无法进行时,计算就成了求解问题的唯一或主要的手段。2004年4月3并行:古老的思想!“.并行计算并不是什么新的思想,只是将它扩展应用于计算机而已”. 作者也不认为这种扩展应用会存在什么无法克服的困难. 但也不要期待有效的并行编程方法与技术能够在一夜之间诞生. 期间还需要有许多的工作和实验要做. 毕竟, 今天的编程技术(串行)是若干年来艰苦的探索才取得的. 现在编程工作似乎成了一种令人单调乏味的工作,事实上,并行编程的出现将会使重新恢复编程工作者们的探索精神 .” (Gill, S. (1958), “Para

3、llel Programming” The Computer Journal, vol. 1, April, pp. 2-10.)Parallel Programming with MPIby Peter Pacheco(2000)2004年4月4什么是并行计算?并行计算: 由运行在多个部件上的小任务合作来求解一个规模很大的计算问题的一种方法例: 在曙光2000上用8个节点计算的Mandelbrot集结果(Mandelbrot为分形理论创始人)2004年4月5现代计算机的共同特点: 并行性2004年4月6现代计算机的共同特点: 并行性2004年4月7为什么要做并行计算? 应用需求2004年4月

4、8为什么要做并行计算?人类对计算及性能的要求是无止境的从系统的角度:集成系统资源,以满足不断增长的对性能和功能的要求从应用的角度:适当分解应用,以实现更大规模或更细致的计算2004年4月9为什么要做并行计算?问题: 科学和工程问题的数值模拟与仿真计算密集数据密集网络密集三种混合要求:在合理的时限内完成计算任务秒级制造业分钟级短时天气预报(当天)小时级中期天气预报(310日)尽可能快长期天气预报(气候)可计算湍流模拟2004年4月102004年4月11并行计算的功能降低单个问题求解的时间增加问题求解规模、提高问题求解精度(多机同时执行多个串行程序)容错、更高的可用性、提高吞吐率2004年4月12

5、如何实现并行计算?分而治之!2004年4月13分而治之并行化的主要方法:分而治之根据问题的求解过程,把任务分成若干子任务(任务级并行或功能并行)根据处理数据的方式,形成多个相对独立的数据区,由不同的处理器分别处理(数据并行)2004年4月14讲座主要内容提示并行计算简介编译环境常用编译器编译优化如何编译数学库并行计算机体系结构并行软件环境并行计算机性能评测MPI 、PVM、OpenMP2004年4月15GNU CompilerGNU Compiler自由软件,一般操作系统都自带支持C/C+、Fortran77、Java、COBAL等等许多语言支持大部分硬件平台高性能计算中常用的:C/C+:GC

6、C (GNU C/C+ Compiler)Fortran 77:G77不支持Fortran 90/ 95不支持OpenMP是最常用的编译器,性能一般(相对于一些针对特定平台优化的编译器)由于缺少对Fortran 90/ 95,限制了其在高性能计算中的使用2004年4月16PGI CompilerPGI Compiler由Portland公司开发的编译器支持AMD Opteron/Althon处理器、Intel Xeon处理器等,在Opteron上同时支持32-bit和64-bit()支持Linux、Windows支持C/C+(pgcc)、Fortran77(pgf77)、Fortran90/9

7、5(pgf90)、HPF(High Performance Fortran)支持多线程和OpenMP最新版本:5.1需要购买,但可以从网上得到15天试用版本 http:/ 2004年4月17Intel CompilerIntel Compiler由Intel公司针对Intel处理器开发(Xeon、Pentium)支持Linux、Windows支持C/C+(icc:Intel C/C+ Compiler)、Fortran77/90/95(ifc: Intel Fortran Compiler)支持多线程和OpenMP最新版本:8.0需要购买,但可以从网上得到30天试用版本 /software 2

8、004年4月18编译优化编译优化对于计算密集型程序的性能提高非常帮助优化消耗CPU资源最多的那部分,即计算密集部分一般采用-O2、-O3可以采用SIMD指令集,eg: Intel和AMD处理器的MMX、SSE1、SSE2具体编译优化的选项和编译器以及CPU相关,参见编译器手册对于有些应用程序,过分的优化会导致计算结果错误2004年4月19编译优化在双路Intel Xeon平台上,采用SSE2优化和不采用SSE2优化,所获得的HPL性能。在这种情况下,采用SSE2技术得到的性能高出近90 2004年4月20编译简介在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不

9、可执行文件大部分编译器通过后缀来区别输入文件的类别,下面来介绍常用的一些后缀.c:C语言源代码文件.f:Fortran 77语言源代码文件.o:编译后的目标文件.a:由目标文件构成的档案库文件.C、.cc、.cxx:C+源代码文件.f90:Fortran 90语言源代码文件.h:程序所包含的头文件2004年4月21基本的用法cc/f77/f90 options filenames 编译器名 编译参数 编译文件其中options就是编译器所需要的参数,filenames给出相关的文件名称2004年4月22常用编译参数-c:只编译,不连接成为可执行文件,编译器只是由输入的.c/.f等源代码文件生成

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

11、4月23常用编译参数-Idirname:将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况:A)#include B)#include “myinc.h” 其中,A类使用尖括号(),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出

12、搜索路径。2004年4月24常用编译参数-Ldirname:将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。-lname:在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。 上面我们简要介绍了编译器最常用的

13、功能和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。2004年4月25GCC应用举例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生成hello2.o gcc o hello hello1.o hello2.o 生成

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

15、不理,并且make命令不会漏掉一个需要更新的文件2004年4月27一个简单的例子先举一个例子: a.c b.c两个程序a.c extern void p(char *); main() p(hello world); b.c void p(char *str) printf(%sn,str); Makefile hello: a.c b.c gcc a.c b.c -o hello 注意这里是一个Tab 执行makegcc a.c b.c -o hello 产生一个叫hello的可执行程序2004年4月28书写makefile文件Makefile时由规则来组成的,每一条规则都有三部分组成:目标

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

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

18、写字母)例: 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月31系统定义的宏还有一些设定好的内部变量,它们根据每一个规则内容定义。$ 当前规则的目的文件名$ 依靠列表中的第一个依靠文件$ 整个依靠的列表(除掉了里面所有重复的文件名)。$? 依赖中所有新于目标的以用变量做许多其它的事情,特别是当你把它们和函数混合 使用的时候。如果需要更进一步的了解,请参考 GNU Make 手册。 (man make, man makefile)2004年4月32修改原

19、先的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月33隐含规则请注意在上面的例子里,几个产生.o文件的命令都是一样的,都是从.c文件和相关文件里产生.o文件,这是一个标准的步骤。其实make已经知道怎么做它有一些叫做隐含规则的内置的规则,这些规则告诉它当你没有给出某些命令的时候,应该怎么办。如果你把生成a.o和b.o的命令从它

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

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

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

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

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

25、分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法.消息传递是当前并行计算领域的一个非常重要的并行程序设计方式2004年4月106什么是MPI?Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准2004年4月107MPI的发展过程发展的两个阶段MPI 1.1: 1

26、995MPICH:是MPI最流行的非专利实现,由Argonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性.MPI 1.22.0:动态进程, 并行 I/O, 支持F90和C+(1997).2004年4月108为什么要用MPI?高可移植性MPI已在IBM PC机上、MS Windows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。2004年4月109从简单入手!下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行

27、程序Hello (下页).该程序在终端打印出Hello World!字样.“Hello World”:一声来自新生儿的问候. 2004年4月110Hello world(C)#include #include mpi.h“main( int argc, char *argv ) MPI_Init( &argc, &argv ); printf( Hello, world!n ); MPI_Finalize();2004年4月111Hello world(Fortran)program maininclude mpif.hinteger ierrcall MPI_INIT( ierr )prin

28、t *, Hello, world!call MPI_FINALIZE( ierr )end2004年4月112C和Fortran中MPI函数约定C必须包含mpi.h.MPI 函数返回出错代码或 MPI_SUCCESS成功标志.MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写.Fortran必须包含mpif.h.通过子函数形式调用MPI,函数最后一个参数为返回值.MPI-前缀,且函数名全部为大写.MPI函数的参数被标志为以下三种类型:IN:参数在例程的调用中不会被修正.OUT:参数在例程的调用中可能会被修正.INOUT:参数在一些例程中为IN,而在另一些例程中为OUT.2

29、004年4月113MPI初始化-MPI_INITint MPI_Init(int *argc, char *argv)MPI_INIT(IERROR)MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数(除MPI_Initialize()外).要求main必须带参数运行,否则出错.2004年4月114MPI结束-MPI_FINALIZEint MPI_Finalize(void)MPI_FINALIZE(IERROR)MPI_FINALIZE是MPI程序的最

30、后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。标志并行代码的结束,结束除主进程外其它进程.之后串行代码仍可在主进程(rank = 0)上运行(如果必须)2004年4月115MPI程序的的编译与运行mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码.mpif77 o hello hello.f 或mpicc o hello hello.c生成hello的可执行代码.mpirun np 4 a.outmpirun np 4 hello4 指定np的实参,表示进程数,由用户指定.a.out / hel

31、lo 要运行的MPI并行程序.%小写onp:The number of process.2004年4月116:运行我们的MPI程序!server0czn17: mpicc -o hello hello.cserver0czn18: ./hello () 0 Aborting program ! Could not create p4 procgroup. Possible missing fileor program started without mpirun.server0czn19: mpirun -np 4 hello () Hello World! Hello World! Hell

32、o World! Hello World!server0czn20:计算机打印字符我们输入的命令2004年4月117:Hello是如何被执行的?SPMD: Single Program Multiple 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

33、, &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();Hello Worl

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

35、_Comm_size(MPI_Comm comm, int *size);用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的IDint MPI_Comm_rank(MPI_Comm comm, int *rank);2004年4月120更新的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 )

36、; MPI_Comm_size( MPI_COMM_WORLD, &numprocs ); printf(“I am %d of %dn, myid, numprocs ); MPI_Finalize();2004年4月121更新的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, numpr

37、ocs, ierr )print *, I am, myid, of, numprocscall MPI_FINALIZE( ierr )end2004年4月122:运行结果server0czn22: mpicc o hello1 hello1.cserver0czn23: mpirun -np 4 hello1I am 0 of 4I am 1 of 4I am 2 of 4I am 3 of 4server0czn24:计算机打印字符我们输入的命令2004年4月123有消息传递 greetings(c)#include #include mpi.hmain(int argc, char*

38、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月124有消息传递 greetings(c) if (myid != 0) strcpy(message, Hello World!); MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99,

39、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月125Greeting执行过程2004年4月126解剖greetings程序头文件: mpi.h/ MPI_Init(int *argc, char *argv

40、) 启动MPI环境,标志并行代码的开始.并行代码之前,第一个mpi函数(除MPI_Initialize()外).要求main必须带能运行,否则出错.通信子(通信空间): MPI_COMM_WORLD:一个通信空间是一个进程组和一个上下文的组合.上下文可看作为组的超级标签,用于区分不同的通信子.在执行函数MPI_Init之后,一个MPI程序的所有进程形成一个缺省的组,这个组的通信子即被写作MPI_COMM_WORLD.该参数是MPI通信操作函数中必不可少的参数,用于限定参加通信的进程的范围.2004年4月127解剖greetings程序int MPI_Comm_size ( MPI_Comm c

41、omm, int *size )获得通信空间comm中规定的组包含的进程的数量.指定一个communicator,也指定了一组共享该空间的进程, 这些进程组成该communicator的 MPI_Comm_rank ( MPI_Comm comm, int *rank ) 得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始).int MPI_Finalize() 标志并行代码的结束,结束除主进程外其它进程.之后串行代码仍可在主进程(rank = 0)上运行(如果必须).2004年4月128消息传送(先可不关心参数含义)MPI_Send(A, 10, MPI_DO

42、UBLE, 1,99, MPI_COMM_WORLD);MPI_Recv(B, 20, MPI_DOBULE, 0, 99, MPI_COMM_WORLD, &status);数据传送 + 同步操作需要发送方与接收方合作完成.DataProcess 0Process 1发送请求YesDataDataDataDataDataDataDataDataTime2004年4月129MPI程序的编译mpicc编译并连接用C语言编写的MPI程序mpiCC编译并连接用C+编写的MPI程序mpif77编译并连接用FORTRAN 77编写的MPI程序mpif90编译并连接用Fortran 90编写的MPI程序这

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

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

45、 np 完整的MPI运行方式:mpirun mpirun_options options详细参数信息执行mpirun -help2004年4月135曙光4000L: MPI-BCLMPI-BCL:为曙光4000l优化的MPI通信库,和基于TCP/IP的网络版MPICH1.2 (三层结构)APIADI:Abstract Device Interface各种不同的底层通信库的不同接口的统一标准(相当于某一种底层通信库)MPI-BCL:MPI-Basic Communication Library具体的底层通信库Point to pointCollective移植:根据不同的device(即平台或底

46、层通信)实现不同的ADI接口2004年4月136曙光4000L: runrun -h|help|-? -sz |-sz -pn -np -pl -cpu program -h|help|-? 得到run的帮助信息,需要帮助时用-sz 指定物理节点数,默认与np数相等,可忽略,run sz 4 np 8 a.out 表示在4个物理节点上运行a.out的8个进程-sz 指定物理节点的长和宽,选定mesh结构,run sz 4X4 a.out表示在一个4*4的mesh结构上组织通信-np 指定进程数-on 指定物理节点列表run on node0.3 a.out 表示在节点0,1,2,3上运行a.o

47、ut-pl 指定节点池名p1,p2,默认为p1/(0-15)-cpu 载入要执行程序的cpu模式 ep独占通讯端口,-en独占节点program 要执行程序名以及其参数常用形式:run np 4 a.out2004年4月137PVM(Parallel Virtual Machine)开发时间: 始于1989年开发单位: 美国橡树岭(Oak Ridge)国家实验室、美国Tennessee大学和Emory大学联合研制特点: 具有较好的适应性、可扩展性、可移植性和易使用性等特点, 源代码可以免费获取, 现已被用户广泛采纳。现状: 目前对它的研究和开发工作仍在各大学和研究机构进行. 随着它的不断流行,

48、 已经被移植到PVP、SMP、MPP、工作站和机群系统。PVM出现的时间较MPI早,且是一个自包含系统(MPI不是自包含的),同时PVM不是一个标准(MPI是个标准)。目前,PVM和MPI正在互相靠拢。2004年4月138PVM概貌PVM系统的组成(两部分):PVM监控进程(Daemon Process), 称为pvmd, 它常驻在虚拟机的每一台节点机上。PVM可调用的库, 称为libpvm3.a, 它与用户的应用程序链接, 用于进程管理, 消息传递和虚拟机管理。在PVM中, 节点(a node)称为主机(a host). 进程(aprocess)称为任务(a task). 并行虚拟机的组成1

49、多台主机(硬件)唯一1个master pvmd, 运行在称为控制台的主机上0多个slave pvmd2004年4月139共享存储并行机模型体系结构特点:多台处理机通过互联网络共享一个统一的内存空间,通过单一内存地址来实现处理机间的协调.内存空间也可由多个存储器模块构成.每台处理机可以执行相同或不同的指令流,每台处理机可以直接访问到所有数据.处理机间通信是借助于共享主存来实现的.可扩展性差,当处理机需要同时访问共享全局变量时,产生内存竞争现象而严重影响效率,比较适合中小规模应用问题的计算和事务处理.2004年4月140共享存储编程标准与特点共享存储器编程标准Pthreads(线程标准) X3H5

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

温馨提示

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

评论

0/150

提交评论