张林 MPI程序设计课件.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《张林 MPI程序设计课件.ppt》由会员分享,可在线阅读,更多相关《张林 MPI程序设计课件.ppt(104页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MPI 程序设计程序设计报告人:张报告人:张 林林导导 师:朱怡安师:朱怡安 教授教授基本基本MPI程序设计程序设计1.1 MPI简介简介 MPI(Message Passing Interface)目标目标:是提供一个实际可用的可用的、可移植的可移植的、高效的高效的和灵活的灵活的消息传递接口标准.MPI以语言独立的语言独立的形式来定义这个接口库,并提供了与C、Fortran和Java语言的绑定.这个定义不包含任何专用于某个特别的制造商、操作系统或硬件的特性.由于这个原因,MPI在并行计算界被广泛地接受。1992年4月 组建了一个制定消息传递接口标准的工作组 1992年10月 初稿形成,主要定
2、义了点对点通信接口 1993年1月 第一届MPI会议在Dallas举行 1993年2月 公布了MPI-1修定版本 1993年11月 MPI的草稿和概述发表在Supercomputing93的会议论文集中 1994年5月 MPI标准正式发布 1994年7月 发布了MPI标准的勘误表 1997年 MPI论坛发布了一个修订的标准,叫做MPI-2,原来MPI更名为MPI-11.1 MPI简介简介MPI是一个库,而不是一门语言。许多人认为MPI就是一种并行语言,这是不准确的。但是按照并行语言的分类,可以把FORTRAN+MPI或C+MPI 看作是一种在原来串行语言基础之上扩展后得到的并行语言。MPI库可
3、以被FORTRAN77/C/Fortran90/C+调用,从语法上说,它遵守所有对库函数/过程的调用规则,和一般的函数/过程没有什么区别。MPI是一种标准或规范的代表,而不特指某一个对它的具体实现。迄今为止所有的并行计算机制造商都提供对MPI的支持,可以在网上免费得MPI在不同并行计算机上的实现,一个正确的MPI程序可以不加修改地在所有的并行机上运行。MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准。MPI虽然很庞大,但是它的最终目的是服务于进程间通信这一目标的。1.2 MPI的特性的特性1.较高的通信性能较高的通信性能2.较好的程序可移植性较好的程序可移植性3.强大的功能
4、强大的功能 MPI提供了一种与语言和平台无关,可以被广泛使用的编写消息传递提供了一种与语言和平台无关,可以被广泛使用的编写消息传递程序的标准,用它来编写消息传递程序,不仅实用、可移植、高效和灵程序的标准,用它来编写消息传递程序,不仅实用、可移植、高效和灵活,而且和当前已有的实现没有太大的变化。活,而且和当前已有的实现没有太大的变化。提供应用程序编程接口。提高通信效率。措施包括避免存储器到存储器的多次重复拷贝,允许计算和通信的重叠等。可在异构环境下提供实现。提供的接口可以方便 C 语言和 Fortran 77的调用。提供可靠的通信接口。即用户不必处理通信失败。定义的接口和现在已有接口(如PVM,
5、NX,Express,p4等)差别不能太大,但是允许扩展以提供更大的灵活性。定义的接口能在基本的通信和系统软件无重大改变时,在许多并行计算机生产商的平台上实现。接口的语义是独立于语言的。接口设计应是线程安全的。1.3 主要的主要的MPI实现平台实现平台 MPICH 是一种最重要的MPI实现,MPICH是一个与MPI-1规范同步发展的版本,每当MPI推出新的版本,就会有相应的MPICH的实现版本,目前MPICH的最新版本是MPICH-1.2.1 它支持部分的MPI-2的特征。Argonne国家试验室和MSU对MPICH作出了重要的贡献。从http:/www-unix.mcs.anl.gov/mp
6、i/mpich可以免费取得。CHIMP Edinburgh开发的另一个免费MPI实现,是在EPCC Edinburgh Parallel Computing Centre 的支持下进行的从CHIMP的开发从1991年到1994年主要开发人员有Alasdair Bruce,James(Hamish)Mills和Gordon Smith。从ftp:/ftp.epcc.ed.ac.uk/chimp/release/可以免费下载该软件。LAM(Local Area Multicomputer)由Ohio State University 开发,它目前的最新版本是LAM/MPI 6.3.2,主要用于异构
7、的计算机网络计算系统。免费版从http:/www.mpi.nd.edu/lam/download/下载。1.3.1 Linux环境下的环境下的MPICH1.将软件包解压将软件包解压通过如下命令tar zxvf mpich.tar.gz2.进入解开的进入解开的mpich子目录子目录cd mpich有些包带有版本信息如1.1.1 1.1.2等3.创建创建Makefile和编译和编译./configure也可以加prefix指出安装的位置:/configure prefix=/usr/local/mpich-1.2.1make其中的configure命令完成MPI的自动配置而make对MPI进行编译
8、。4.测试安装是否正确测试安装是否正确cd examples/basicmake cpi././bin/mpirun np 4 cpi 或者直接在$(HOME)/mpich下运行make testing5.将将mpich安装到指定的目录安装到指定的目录make install其中安装位置由配置时prefix指定1.3.2 window环境下的环境下的MPICH NT上的MPICH版本是MPICH.NT.1.2.0.4。该版本支持tcp/ip,共享内存和VIA连接。同一个机器上的进程间通信是通过共享内存队列实现的,而不同机器上的进程间通信是通过sockets或VI实现的。C/C+程序的编译要编译
9、一个用C/C+编写的MPI程序用MS Visual C+来编译的步骤是1.创建一个新的makefile或项目project 文件然后进行必要的设置2.在include路径增加 MPICH Homeinclude3.设置开关选项 Debug-/MTd Release-/MT4.需要连接的库 Debug-ws2_32.lib mpichd.lib pmpichd.lib romiod.lib Release-ws2_32.lib mpich.lib pmpich.lib romio.lib pmpich*.lib 库是在MPI程序中使用了PMPI_*调用是才需要的5.增加库lib路径 MPICH
10、Homelib在项目中加入MPI源程序然后执行buildFORTRAN 程序的编译对于FORTRAN程序建议使用Visual Fortran 6+编译器1.增加 mpif.h2.Visual Fortran 6+的编译开关 /iface:cref /iface:nomixed_str_len_arg3.连接的库和C/C+的相同2.MPI程序框架程序框架头文件头文件相关变量声明程序开始程序体计算与通讯程序结束程序结束MPI 程序设计实例程序设计实例#include mpi.h#include#include void main(argc,argv)int argc;char*argv;int m
11、yid,numprocs;int namelen;char processor_nameMPI_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,Hello World!Process%d of%d on%sn,myid,numprocs,processor_name);MPI_Final
12、ize();用用MPI实现实现“Hello World”实例程序解释实例程序解释include mpi.hMPI相对于相对于C实现的头文件实现的头文件mpi.hint myid,numprocs;int namelen;char processor_nameMPI_MAX_PROCESSOR_NAME;定义程序中所需要的与定义程序中所需要的与MPI有关的变量有关的变量MPI_MAX_PROCESSOR_NAME是MPI预定义的宏,即某一MPI的具体实现中允许机器名字的最大长度,机器名放在变量processor_name中。整型变量myid和numprocs分别用来记录某一个并行执行进程的标识和
13、所有参加计算的进程的个数namelen是实际得到的机器名字的长度。MPI_Init();MPI_Finalize();MPI程序的开始和结束必须是MPI_Init和MPI_Finalize,分别完成MPI程序的初始化和结束工作。MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);MPI_Get_processor_name(processor_name,&namelen);fprintf(stderr,Hello World!Process%d of%d on%sn,myid,numprocs,
14、processor_name);MPI_Comm_rank:得到当前正在运行的进程的标识号,放在myid中;MPI_Comm_size:得到所有参加运算的进程的个数放在numprocs中;MPI_Get_processor_name:得到本进程运行的机器的名称结果放在 processor_name中;它是一个字符串,而该字符串的长度 在namelen中;fprintf语句将本进程的标识号,并行执行的进程的个数,本进程所运行的机器的名字打印出来,和一般的C程序不同的是这些程序体中的执行语句是并行执行的,每一个进程都要执行。实例程序解释实例程序解释MPI程序的程序体程序的程序体(包括各种包括各种M
15、PI过程调用语句和过程调用语句和C语句语句)假如本程序启动时共产生假如本程序启动时共产生4个进程同时运行,而运行本程序的机器的个进程同时运行,而运行本程序的机器的机器名为机器名为“tp5”,4个进程都在个进程都在tp5上运行,其标识分别为上运行,其标识分别为0,1,2,3,执行结果如下所示,虽然这一执行结果如下所示,虽然这一MPI程序本身只有一条打印语句,但是程序本身只有一条打印语句,但是由于它启动了四个进程同时执行,每个进程都执行打印操作,故而最终由于它启动了四个进程同时执行,每个进程都执行打印操作,故而最终的执行结果有四条打印语句。的执行结果有四条打印语句。实例程序解释实例程序解释Hell
16、o World!Process 0 of 4 on tp5Hello World!Process 1 of 4 on tp5Hello World!Process 3 of 4 on tp5Hello World!Process 2 of 4 on tp5 如果该程序在如果该程序在4台不同的机器台不同的机器tp1,tp3,tp4,tp5上执行,则其最终上执行,则其最终的执行结果将如下所示,即的执行结果将如下所示,即4个进程所运行的机器是不同的。由于个进程所运行的机器是不同的。由于4个进程个进程同时执行,在本程序中没有限定打印语句的顺序,因此不管哪个进程的打同时执行,在本程序中没有限定打印语句的
17、顺序,因此不管哪个进程的打印语句在前,哪个在后,都没有关系只要有印语句在前,哪个在后,都没有关系只要有4条正确的输出语句即可。条正确的输出语句即可。Hello World!Process 0 of 4 on tp5Hello World!Process 1 of 4 on tp1Hello World!Process 2 of 4 on tp3Hello World!Process 3 of 4 on tp42.1 MPI程序设计的惯例程序设计的惯例所有MPI的名字都有前缀“MPI_”,不管是常量、变量还是过程或函数调用的名字都是这样。在自己编写的程序中不准说明以前缀“MPI_”开始的任何变量
18、和函数,这样做的主要目的是为了避免与MPI可能的名字混淆。FORTRAN形式的MPI调用,一般全为大写(虽然FORTRAN不区分大小写),而C形式的MPI调用,则为MPI_Aaaa_aaa的形式。FORTRAN中的句柄以整型表示,二值变量是逻辑类型。FORTRAN的数组下标是以1开始,但在C中是以0开始。2.2 MPI基本函数基本函数 对于有参数的对于有参数的MPI调用,调用,MPI首先给出一种独立于具体语言的说明,对各个首先给出一种独立于具体语言的说明,对各个参数的性质进行介绍,然后在给出它相对于参数的性质进行介绍,然后在给出它相对于FORTRAN 77和和C的原型说明,在的原型说明,在MP
19、I-2中还给出了中还给出了C+形式的说明。形式的说明。MPI对参数说明的方式有三种,分别是对参数说明的方式有三种,分别是IN、OUT和和INOUT 它们的含义分别是:它们的含义分别是:IN(输入)输入):调用部分传递给MPI的参数MPI除了使用该参数外不允许对这一参数做任何修改。OUT(输出)(输出):MPI返回给调用部分的结果参数该参数的初始值对MPI没 有任何意义。INOUT(输入输出)(输入输出):调用部分首先将该参数传递给MPI,MPI对这一参数引用修改后,将结果返回给外部调用,该参数的初始值和返回结果都有意义。独立于具体语言的说明独立于具体语言的说明C形式的原型说明FORTRAN形式
20、的原型说明 MPI的定义在最大范围内避免INOUT参数的使用,因为这些使用易于出错特别是对标量参数。首先给出的是MPI调用不依赖任何语言,然后给出这个调用的标准C版本最后给出这个函数的 FORTRAN 77 版本以MPI_INIT为例MPI_INIT()独立于语言的说明,对于这一个调用没有参数说明。独立于语言的说明,对于这一个调用没有参数说明。int MPI_Init(int*argc,char*argv)C语言的说明,对于语言的说明,对于C语言调用需要给出参数语言调用需要给出参数argc和和argv。MPI_INIT(IERROR)INTEGER IERRORFORTRAN77说明部分对于所
21、有的说明部分对于所有的FORTRAN77调用都有返回的错误代码调用都有返回的错误代码IERROR2.2 MPI基本函数基本函数 在在MPI-1中,共有中,共有128个调用接口,在个调用接口,在MPI-2中有中有287个,应该说个,应该说MPI是比较庞是比较庞大的,完全掌握这么多的调用对于初学者来说是比较困难。但是从理论上说,大的,完全掌握这么多的调用对于初学者来说是比较困难。但是从理论上说,MPI所有的通信功能可以用它的所有的通信功能可以用它的6个基本的调用来实现,掌握了这个基本的调用来实现,掌握了这6个调用,就可个调用,就可以实现所有的消息传递并行程序的功能,因此,首先介绍这以实现所有的消息
22、传递并行程序的功能,因此,首先介绍这6个最基本的调用。个最基本的调用。MPI_InitMPI_FinalizeMPI_Comm_sizeMPI_Comm_rankMPI_SendMPI_Recv启动启动MPI结束结束MPI计算计算确定进程数确定进程数返回进程返回进程ID发送一条消息发送一条消息接收一条消息接收一条消息2.2 MPI基本函数基本函数2.2.1 MPI初始化初始化MPI调用接口调用接口1 MPI_INITMPI_INIT()int MPI_Init(int*argc,char*argv)MPI_INIT(IERROR)INTEGER IERROR MPI_INIT是是MPI程序的第
23、一个调用,它完成程序的第一个调用,它完成MPI程序所有的初始化工程序所有的初始化工作,所有作,所有MPI程序的第一条可执行语句都是这条语句。程序的第一条可执行语句都是这条语句。2.2.2 MPI结束结束 MPI调用接口调用接口2 MPI_FINALIZEMPI_FINALIZE()int MPI_Finalize(void)MPI_FINALIZE(IERROR)INTEGER IERROR MPI_FINALIZE是是MPI程序的最后一个调用,它结束程序的最后一个调用,它结束MPI程序的运行,程序的运行,它是它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的程序的最后一条可执
24、行语句,否则程序的运行结果是不可预知的2.2.3 当前进程标识当前进程标识MPI调用接口调用接口3 MPI_COMM_RANKMPI_COMM_RANK(comm,rank)IN comm 该进程所在的通信域(句柄)OUT rank 调用进程在comm中的标识号int MPI_Comm_rank(MPI_Comm comm,int*rank)MPI_COMM_RANK(COMM,RANK,IERROR)INTEGER COMM,RANK,IERROR 这一调用返回调用进程在给定的通信域中的进程标识号,有了这一标识号,这一调用返回调用进程在给定的通信域中的进程标识号,有了这一标识号,不同的进程就
25、可以将自身和其它的进程区别开来,实现各进程的并行和协作。不同的进程就可以将自身和其它的进程区别开来,实现各进程的并行和协作。2.2.4 通信域包含的进程数通信域包含的进程数MPI调用接口调用接口4 MPI_COMM_SIZEMPI_COMM_SIZE(comm,size)IN comm 通信域(句柄)OUT size 通信域comm内包括的进程数(整数)int MPI_Comm_size(MPI_Comm comm,int*size)MPI_COMM_SIZE(COMM,SIZE,IERROR)INTEGER COMM,SIZE,IERROR 这一调用返回给定的通信域中所包括的进程的个数,不同
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 张林 MPI程序设计课件 MPI 程序设计 课件
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内