中科院计算所谭光明老师课件C01-基本的MPI编程技术

上传人:w****i 文档编号:91943448 上传时间:2019-07-04 格式:PPT 页数:118 大小:1.23MB
返回 下载 相关 举报
中科院计算所谭光明老师课件C01-基本的MPI编程技术_第1页
第1页 / 共118页
中科院计算所谭光明老师课件C01-基本的MPI编程技术_第2页
第2页 / 共118页
中科院计算所谭光明老师课件C01-基本的MPI编程技术_第3页
第3页 / 共118页
中科院计算所谭光明老师课件C01-基本的MPI编程技术_第4页
第4页 / 共118页
中科院计算所谭光明老师课件C01-基本的MPI编程技术_第5页
第5页 / 共118页
点击查看更多>>
资源描述

《中科院计算所谭光明老师课件C01-基本的MPI编程技术》由会员分享,可在线阅读,更多相关《中科院计算所谭光明老师课件C01-基本的MPI编程技术(118页珍藏版)》请在金锄头文库上搜索。

1、基本的MPI编程技术,谭光明 副研究员 中国科学院计算技术研究所 国家智能计算机研究开发中心 计算机体系结构国家重点实验室(筹),2/122,参考文献,黄铠,徐志伟著,陆鑫达等译. 可扩展并行计算技术,结构与编程. 北京:机械工业出版社, P.3356,P.227237, 2000. 陈国良著.并行计算结构、算法、编程. 北京:高等教育出版社,1999. Barry Wilkinson and Michael Allen. Parallel Programming(Techniques and Applications using Networked Workstations and Par

2、allel Computers). Prentice Hall, 1999. 李晓梅,莫则尧等著. 可扩展并行算法的设计与分析. 北京:国防工业出版社,2000. 张宝琳,谷同祥等著. 数值并行计算原理与方法. 北京:国防工业出版社,1999. 都志辉著. 高性能计算并行编程技术MPI并行程序设计. 北京:清华大学出版社, 2001.,什么是MPI?,Massage Passing Interface:是消息传递函数库的标准规范。 由MPI论坛开发.支持Fortran、C和C+。 一种新的库描述, 不是一种语言.,4/122,消息传递并行程序设计,消息传递并行程序设计 用户必须通过显式地发送和

3、接收消息来实现处理机间的数据交换。 每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。 这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。 并行计算粒度大,特别适合于大规模可扩展并行算法 由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法. 消息传递是当前并行计算领域的一个非常重要的并行程序设计方式,5/122,从简单入手!,下面我们首先分别以C语言和Fortran语言的形式给出一个最简单的MPI并行程序Hello (下页). 该程序在终端打印出Hell

4、o World!字样. “Hello World”:一声来自新生儿的问候.,6/122,Hello world (C),#include #include “mpi.h“ main( int argc, char *argv ) MPI_Init( ,7/122,Hello world (Fortran),program main include mpif.h integer ierr call MPI_INIT( ierr ) print *, Hello, world! call MPI_FINALIZE( ierr ) end,8/122,MPI程序的的编译与运行,mpif77 hell

5、o.f 或 mpicc hello.c 默认生成a.out的可执行代码. mpif77 o hello hello.f 或 mpicc o hello hello.c 生成hello的可执行代码. mpirun np 4 a.out mpirun np 4 hello 4 指定np的实参,表示进程数,由用户指定. a.out / hello 要运行的MPI并行程序.,%小写o,np: The number of process.,9/122,:Hello是如何被执行的?,SPMD: Single Program Multiple Data(MIMD) :,#include “mpi.h“ #i

6、nclude main( int argc, char *argv ) MPI_Init( ,#include “mpi.h“ #include main( int argc, char *argv ) MPI_Init( ,#include “mpi.h“ #include main( int argc, char *argv ) MPI_Init( ,#include “mpi.h“ #include main( int argc, char *argv ) MPI_Init( ,Hello World! Hello World! Hello World! Hello World!,#in

7、clude “mpi.h“ #include main( int argc, char *argv ) MPI_Init( ,10/122,C和Fortran中MPI函数约定,C 必须包含mpi.h. MPI 函数返回出错代码或 MPI_SUCCESS成功标志. MPI-前缀,且只有MPI以及MPI_标志后的第一个字母大写,其余小写. Fortran 必须包含mpif.h. 通过子函数形式调用MPI,函数最后一个参数为返回值. MPI-前缀,且函数名全部为大写. MPI函数的参数被标志为以下三种类型: IN:参数在例程的调用中不会被修正. OUT:参数在例程的调用中可能会被修正. INOUT:

8、参数在一些例程中为IN,而在另一些例程中为OUT.,11/122,:开始写MPI并行程序,在写MPI程序时,我们常需要知道以下两个问题的答案: 任务由多少个进程来进行并行计算? 我是哪一个进程?,12/122,:开始写MPI并行程序,MPI 提供了下列函数来回答这些问题: 用MPI_Comm_size 获得进程个数p int MPI_Comm_rank(MPI_Comm comm, int *rank); 用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的ID int MPI_Comm_size(MPI_Comm comm, int *

9、size);,MPI基本函数,int MPI_Init ( int* argc /* in/out */, char* argv /* in/out */) 通常应该是第一个被调用的MPI函数 除MPI_Initialized()外,其余所有的MPI函数应该在其后被调用 MPI系统将通过argc,argv得到命令行参数,MPI基本函数,int MPI_Finalize (void) 退出MPI系统,所有进程正常退出都必须调用。表明并行代码的结束,结束除主进程外其它进程. 串行代码仍可在主进程(rank = 0)上运行,但不能再有MPI函数(包括MPI_Init()),MPI基本函数,int M

10、PI_Comm_size ( MPI_Comm comm /* in */, int* size /* out */) 获得进程个数 size 指定一个通信子,也指定了一组共享该空间的进程, 这些进程组成该通信子的group. 获得通信子comm中规定的group包含的进程的数量.,MPI基本函数,int MPI_Comm_rank ( MPI_Comm comm /* in */, int* rank /* out */) 得到本进程在通信空间中的rank值,即在组中的逻辑编号(该 rank值为0到p-1间的整数,相当于进程的ID。).,MPI 程序的基本结构,#include “mpi.h

11、“ . . int main(int argc, char *argv) int myrank, nprocs; MPI_Init( ,18/122,更新的Hello World (c),#include #include “mpi.h“ main( int argc, char *argv ) int myid, numprocs; MPI_Init( ,19/122,更新的Hello World (Fortran),program main include mpif.h integer ierr, myid, numprocs call MPI_INIT( ierr ) call MPI_

12、COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) print *, I am, myid, of, numprocs call MPI_FINALIZE( ierr ) end,20/122,:运行结果,mpicc o hello1 hello1.c mpirun -np 4 hello1 I am 0 of 4 I am 1 of 4 I am 2 of 4 I am 3 of 4,21/122,有消息传递greetings(c),#include #inc

13、lude “mpi.h“ main(int argc, char* argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init(,22/122,有消息传递greetings(c),if (myid != 0) strcpy(message, “Hello World!“); MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99, MPI_COMM_WORLD); else /* myid = 0 */ for (source = 1; source

14、numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* end main */,23/122,Greeting执行过程,24/122,解剖greetings程序,头文件: mpi.h/mpif.h. int MPI_Init(int *argc, char *argv) 启动MPI环境,标志并行代码的开始. 并行代码之前,第一个mpi函数(除MPI_Initialize()外). 要求main必须带能运行,否则出错. 通信子(通信空间): MPI_COMM_WORLD: 一个通信空间是

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

16、MPI_Comm_rank ( MPI_Comm comm, int *rank ) 得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始). int MPI_Finalize() 标志并行代码的结束,结束除主进程外其它进程. 之后串行代码仍可在主进程(rank = 0)上运行(如果必须).,26/122,消息传送(先可不关心参数含义),MPI_Send(A, 10, MPI_DOUBLE, 1,99, MPI_COMM_WORLD); MPI_Recv(B, 20, MPI_DOBULE, 0, 99, MPI_COMM_WORLD, ,数据传送 + 同步操作,需要发送方与接收方合作完成.,27/122,最基本的MPI,MPI调用借口的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号