MPI并行程序设计.ppt

上传人:本田雅阁 文档编号:2977066 上传时间:2019-06-16 格式:PPT 页数:219 大小:3.44MB
返回 下载 相关 举报
MPI并行程序设计.ppt_第1页
第1页 / 共219页
MPI并行程序设计.ppt_第2页
第2页 / 共219页
MPI并行程序设计.ppt_第3页
第3页 / 共219页
MPI并行程序设计.ppt_第4页
第4页 / 共219页
MPI并行程序设计.ppt_第5页
第5页 / 共219页
点击查看更多>>
资源描述

《MPI并行程序设计.ppt》由会员分享,可在线阅读,更多相关《MPI并行程序设计.ppt(219页珍藏版)》请在三一文库上搜索。

1、2019年6月,MPI并行程序设计,1/217,机群应用开发 并行编程原理及 程序设计 Parallel Programming: Fundamentals and Implementation 曙光信息产业有限公司 2019年6月,2019年6月,MPI并行程序设计,2/217,参考文献,黄铠,徐志伟著,陆鑫达等译. 可扩展并行计算技术,结构与编程. 北京:机械工业出版社, P.3356,P.227237, 2000. 陈国良著.并行计算结构、算法、编程. 北京:高等教育出版社,1999. Barry Wilkinson and Michael Allen. Parallel Program

2、ming(Techniques and Applications using Networked Workstations and Parallel Computers). Prentice Hall, 1999. 李晓梅,莫则尧等著. 可扩展并行算法的设计与分析. 北京:国防工业出版社,2000. 张宝琳,谷同祥等著. 数值并行计算原理与方法. 北京:国防工业出版社,1999. 都志辉著. 高性能计算并行编程技术MPI并行程序设计. 北京:清华大学出版社, 2001.,2019年6月,MPI并行程序设计,3/217,相关网址,MPI: http:/ww.mpi-forum.org, http

3、:/www.mcs.anl.gov/mpi Pthreads: http:/ PVM: http:/www.epm.ornl.gov/pvm/ OpemMP: http:/www.openmp.org 网上搜索:,2019年6月,MPI并行程序设计,4/217,MPI并行程序设计 Parallel Programming with the Massage Passing Interface (MPI),2019年6月,MPI并行程序设计,5/217,多线程库标准 Win32 API. POSIX threads. 编译制导标准 OpenMP 可移植共享存储并行编程标准. 消息传递库标准 MPI

4、 PVM,并行编程标准,本讨论的重点,2019年6月,MPI并行程序设计,6/217,消息传递并行程序设计,消息传递并行程序设计 指用户必须通过显式地发送和接收消息来实现处理机间的数据交换。 在这种并行编程中,每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。 这种编程方式是大规模并行处理机(MPP)和机群(Cluster)采用的主要编程方式。 并行计算粒度大,特别适合于大规模可扩展并行算法 由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,并行计算粒度大,特别适合于大规模可扩展并行算法. 消息传递是当前并行计算领域的一个非常重要的

5、并行程序设计方式,2019年6月,MPI并行程序设计,7/217,什么是MPI?,Massage Passing Interface:是消息传递函数库的标准规范,由MPI论坛开发,支持Fortran和C 一种新的库描述,不是一种语言。共有上百个函数调用接口,在Fortran和C语言中可以直接对这些函数进行调用 MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现 MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准,2019年6月,MPI并行程序设计,8/217,MPI的发展过程,发展的两个阶段 MPI 1.1: 1995 MPICH:是MPI最流行的非专利实现,由Ar

6、gonne国家实验室和密西西比州立大学联合开发,具有更好的可移植性. MPI 1.22.0:动态进程, 并行 I/O, 支持F90和C+(1997).,2019年6月,MPI并行程序设计,9/217,为什么要用MPI?,高可移植性 MPI已在IBM PC机上、MS Windows上、所有主要的Unix工作站上和所有主流的并行机上得到实现。使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBM PC、MS Windows、Unix工作站、以及各种并行机上。,2019年6月,MPI并行程序设计,10/217,讲座内容提示,基本的MPI 基本概念 点到点通信(Point to po

7、int) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 深入MPI 用户自定义(/派生)数据类型(User-defined(Derived) data type) 事实上MPI的所有数据类型均为MPI自定义类型 支持异构系统 允许消息来自不连续的或类型不一致的存储区(结构,数组散元) 集合通信(Collective) 数据移动,数据聚集,同步 基于point to point 构建 MPI环境管理函数 组,上下文和通信空间/通信子的管理 实例,2019年6月,MPI并行程序设计,11/217,从简单入手!,下面我们首先分别以C语言和Fortran语言的形式给出

8、一个最简单的MPI并行程序Hello (下页). 该程序在终端打印出Hello World!字样. “Hello World”:一声来自新生儿的问候.,2019年6月,MPI并行程序设计,12/217,Hello world(C),#include #include “mpi.h“ main( int argc, char *argv ) MPI_Init( ,2019年6月,MPI并行程序设计,13/217,Hello world(Fortran),program main include mpif.h integer ierr call MPI_INIT( ierr ) print *,

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

10、数在一些例程中为IN,而在另一些例程中为OUT.,2019年6月,MPI并行程序设计,15/217,MPI初始化-MPI_INIT,int MPI_Init(int *argc, char *argv) MPI_INIT(IERROR) MPI_INIT是MPI程序的第一个调用,它完成MPI程序的所有初始化工作。所有的MPI程序的第一条可执行语句都是这条语句。 启动MPI环境,标志并行代码的开始. 并行代码之前,第一个mpi函数(除MPI_Initialize()外). 要求main必须带参数运行,否则出错.,2019年6月,MPI并行程序设计,16/217,MPI结束-MPI_FINALIZ

11、E,int MPI_Finalize(void) MPI_FINALIZE(IERROR) MPI_FINALIZE是MPI程序的最后一个调用,它结束MPI程序的运行,它是MPI程序的最后一条可执行语句,否则程序的运行结果是不可预知的。 标志并行代码的结束,结束除主进程外其它进程. 之后串行代码仍可在主进程(rank = 0)上运行(如果必须).,2019年6月,MPI并行程序设计,17/217,MPI程序的的编译与运行,mpif77 hello.f 或 mpicc hello.c 默认生成a.out的可执行代码. mpif77 o hello hello.f 或 mpicc o hello

12、hello.c 生成hello的可执行代码. mpirun np 4 a.out mpirun np 4 hello 4 指定np的实参,表示进程数,由用户指定. a.out / hello 要运行的MPI并行程序.,%小写o,np: The number of process.,2019年6月,MPI并行程序设计,18/217,:运行我们的MPI程序!,dairnode01 $ mpicc -o hello hello.c dairnode01 $ ./hello () 0 Aborting program ! Could not create p4 procgroup. Possible

13、missing fileor program started without mpirun. dairnode01 $ mpirun -np 4 hello () Hello World! Hello World! Hello World! Hello World! dairnode01 $,计算机打印字符,我们输入的命令,2019年6月,MPI并行程序设计,19/217,:Hello是如何被执行的?,SPMD: Single Program Multiple Data(SPMD) :,#include “mpi.h“ #include main( int argc, char *argv )

14、 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!,#include “mpi.h“ #include main( int ar

15、gc, char *argv ) MPI_Init( ,2019年6月,MPI并行程序设计,20/217,:开始写MPI并行程序,在写MPI程序时,我们常需要知道以下两个问题的答案: 任务由多少个进程来进行并行计算? 我是哪一个进程?,2019年6月,MPI并行程序设计,21/217,:开始写MPI并行程序,MPI 提供了下列函数来回答这些问题: 用MPI_Comm_size 获得进程个数 p int MPI_Comm_size(MPI_Comm comm, int *size); 用MPI_Comm_rank 获得进程的一个叫rank的值,该 rank值为0到p-1间的整数,相当于进程的ID

16、 int MPI_Comm_rank(MPI_Comm comm, int *rank);,2019年6月,MPI并行程序设计,22/217,更新的Hello World(c),#include #include “mpi.h“ main( int argc, char *argv ) int myid, numprocs; MPI_Init( ,2019年6月,MPI并行程序设计,23/217,更新的Hello World(Fortran),program main include mpif.h integer ierr, myid, numprocs call MPI_INIT( ierr

17、 ) call MPI_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,2019年6月,MPI并行程序设计,24/217,:运行结果,dairnode01 $ mpicc o hello1 hello1.c dairnode01 $ mpirun -np 4 hello1 I am 0 of 4 I am 1 of 4 I am 2

18、 of 4 I am 3 of 4 dairnode01 $,计算机打印字符,我们输入的命令,2019年6月,MPI并行程序设计,25/217,有消息传递 Greeting,2019年6月,MPI并行程序设计,26/217,greetings(c),#include #include “mpi.h“ main(int argc, char* argv) int numprocs, myid, source; MPI_Status status; char message100; MPI_Init(,2019年6月,MPI并行程序设计,27/217,有消息传递greetings(c),if (m

19、yid != 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 numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* end main */,2019年6月,MPI并行程序设计,28/217,解剖greetings程序,头文件: mpi.h

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

21、9年6月,MPI并行程序设计,29/217,解剖greetings程序,int MPI_Comm_size ( MPI_Comm comm, int *size ) 获得通信空间comm中规定的组包含的进程的数量. 指定一个communicator,也指定了一组共享该空间的进程, 这些进程组成该communicator的group. int MPI_Comm_rank ( MPI_Comm comm, int *rank ) 得到本进程在通信空间中的rank值,即在组中的逻辑编号(从0开始). int MPI_Finalize() 标志并行代码的结束,结束除主进程外其它进程. 之后串行代码仍可

22、在主进程(rank = 0)上运行(如果必须).,2019年6月,MPI并行程序设计,30/217,消息传送(先可不关心参数含义),MPI_Send(A, 10, MPI_DOUBLE, 1,99, MPI_COMM_WORLD); MPI_Recv(B, 20, MPI_DOBULE, 0, 99, MPI_COMM_WORLD, ,数据传送 + 同步操作,需要发送方与接收方合作完成.,2019年6月,MPI并行程序设计,31/217,最基本的MPI,MPI调用借口的总数虽然庞大,但根据实际编写MPI的经验,常用的MPI调用的个数确实有限。下面是6个最基本的MPI函数。 MPI_Init()

23、; MPI_Comm_size(); MPI_Comm_rank(); MPI_Send(); MPI_Recv(); MPI_Finalize();,MPI_Init(); 并行代码; MPI_Fainalize(); 只能有串行代码;,2019年6月,MPI并行程序设计,32/217,讲座内容提示,基本的MPI 基本概念 点到点通信(Point to point) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 深入MPI 用户自定义(/派生)数据类型(User-defined(Derived) data type) 事实上MPI的所有数据类型均为MPI自定

24、义类型 支持异构系统 允许消息来自不连续的或类型不一致的存储区(结构,数组散元) 集合通信(Collective) 数据移动,数据聚集,同步 基于point to point 构建 MPI环境管理函数 组,上下文和通信空间/通信子的管理 实例,2019年6月,MPI并行程序设计,33/217,Point to Point,单个进程对单个进程的通信,重要且复杂 术语 Blocking(阻塞) :一个例程须等待操作完成才返回,返回后用户可以重新使用调用中所占用的资源. Non-blocking(非阻塞):一个例程不必等待操作完成便可返回,但这并不意味着所占用的资源可被重用. Local(本地):不

25、依赖于其它进程. Non-local(非本地):依赖于其它进程.,2019年6月,MPI并行程序设计,34/217,Blocking Send,int MPI_Send(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm); IN buf 发送缓冲区的起始地址 IN count 要发送信息的元素个数 IN datatype 发送信息的数据类型 IN dest 目标进程的rank值 IN tag 消息标签 IN comm 通信子,2019年6月,MPI并行程序设计,35/217,Blockin

26、g Receive,int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status); OUT buf 接收缓冲区的起始地址 IN count 要接收信息的元素个数 IN datatype 接收信息的数据类型 IN source 源进程的rank值 IN tag 消息标签 IN comm 通信子 OUT status status对象,包含实际接收到的消息的有关信息,2019年6月,MPI并行程序设计,36/217,MPI消息,MPI

27、消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容 数据: 信封:,2019年6月,MPI并行程序设计,37/217,消息数据,由count个类型为datatype的连续数据空间组成, 起始地址为buf 不是以字节数, 而是以元素的个数指定消息的长度 count可以是零, 这种情况下消息的数据部分是空的 MPI基本数据类型相应于宿主语言的基本数据类型,2019年6月,MPI并行程序设计,38/217,什么是缓冲区?,应用程序中说明的变量,在消息传递语句中又用作缓冲区的起始位置. 也可表示由系统(不同用户)创建和管理的某一存储区域,在消息传递过程中

28、用于暂存放消息.也被称为系统缓冲区. 用户可设置一定大小的存储区域,用作中间缓冲区以保留可能出现在其应用程序中的任意消息.,系统缓冲区,用户指定缓冲区,用户缓冲区,2019年6月,MPI并行程序设计,39/217,MPI标识一条消息的信息包含四个域: Source: 发送进程隐式确定,由进程的rank值唯一标识 Destination: Send函数参数确定 Tag: Send函数参数确定,用于识别不同的消息 (0,UB),UB:MPI_TAG_UB=32767. Communicator: 缺省MPI_COMM_WORLD Group:有限/N,有序/Rank 0,1,2,N-1 Conte

29、x:Super_tag,用于标识该通讯空间.,消息信封,2019年6月,MPI并行程序设计,40/217,2019年6月,MPI并行程序设计,41/217,消息匹配,接收buffer必须至少可以容纳count个由datatype参数指明类型的数据. 如果接收buf太小, 将导致溢出、出错. 消息匹配 参数匹配 dest,tag,comm/ source,tag,comm Source = MPI_ANY_SOURCE:接收任意处理器来的数据(任意消息来源). Tag = MPI_ANY_TAG:匹配任意tag值的消息(任意tag消息). 在阻塞式消息传送中不允许Source=Dest,否则会导

30、致deadlock. 消息传送被限制在同一个communicator. 在send函数中必须指定唯一的接收者(Push/pull通讯机制).,2019年6月,MPI并行程序设计,42/217,status参数,当使用MPI_ANY_SOURCE或/和MPI_ANY_TAG接收消息时如何确定消息的来源source 和 tag值呢? 在C中,status.MPI_SOURCE, status.MPI_TAG. 在Fortran中, source=status(MPI_SOURCE), tag=status(MPI_TAG). Status还可用于返回实际接收到消息的长度 int MPI_Get_c

31、ount(MPI_Status status, MPI_Datatype datatype,int* count) IN status 接收操作的返回值. IN datatype 接收缓冲区中元素的数据类型. OUT count 接收消息中的元素个数.,2019年6月,MPI并行程序设计,43/217,分析greetings,#include #include “mpi.h“ main(int argc, char* argv) int numprocs; /*进程数,该变量为各处理器中的同名变量, 存储是分布的 */ int myid; /*我的进程ID,存储也是分布的 */ MPI_Sta

32、tus status; /*消息接收状态变量,存储也是分布的 */ char message100; /*消息buffer,存储也是分布的 */ /*初始化MPI*/ MPI_Init(,2019年6月,MPI并行程序设计,44/217,分析greetings,if (myid != 0) /*建立消息*/ sprintf(message, “Greetings from process %d!“,myid); /* 发送长度取strlen(message)+1,使0也一同发送出去*/ MPI_Send(message,strlen(message)+1, MPI_CHAR, 0,99,MPI

33、_COMM_WORLD); else /* my_rank = 0 */ for (source = 1; source numprocs; source+) MPI_Recv(message, 100, MPI_CHAR, source, 99, MPI_COMM_WORLD, /* End main */,2019年6月,MPI并行程序设计,45/217,Greetings执行过程,假设进程数为3 (进程0) (进程1) (进程2) (rank=0) (rank=1) (rank=2),. . Recv(); . . Recv(); . .,. . . Send(); . . .,. .

34、. Send() . . .,问题:进程1和2谁先向根进程发送消息?,?,%,2019年6月,MPI并行程序设计,46/217,运行greetings,dairnode01 $ mpicc o greeting greeting.c dairnode01 $ mpirun -np 4 greeting Greetings from process 1! Greetings from process 2! Greetings from process 3! dairnode01 $,计算机打印字符,我们输入的命令,2019年6月,MPI并行程序设计,47/217,现在您已经能够用MPI进行并行编

35、程了!,2019年6月,MPI并行程序设计,48/217,避免死锁deadlock,发送和接收是成对出现的,忽略这个原则 很可能会产生死锁,总会死锁的通信调用次序,2019年6月,MPI并行程序设计,49/217,不安全的通信调用次序,2019年6月,MPI并行程序设计,50/217,安全的通信调用次序,2019年6月,MPI并行程序设计,51/217,MPI_Sendrecv函数原型,int MPI_Sendrecv( void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvb

36、uf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status) 数据轮换,2019年6月,MPI并行程序设计,52/217,MPI_Sendrecv用法示意, int a,b; MPI_Status status; int dest = (rank+1)%p; int source = (rank + p -1)%p; /*p为进程个数*/ MPI_Sendrecv( 该函数被每一进程执行一次.,2019年6月,MPI并行程序设计,53/217,空进程,r

37、ank = MPI_PROC_NULL的进程称为空进程 使用空进程的通信不做任何操作. 向MPI_PROC_NULL发送的操作总是成功并立即返回. 从MPI_PROC_NULL接收的操作总是成功并立即返回,且接收缓冲区内容为随机数. status status.MPI_SOURCE = MPI_PROC_NULL status.MPI_TAG = MPI_ANY_TAG MPI_Get_count(&status,MPI_Datatype datatype, &count) =count = 0,空进程,2019年6月,MPI并行程序设计,54/217,空进程应用示意, MPI_Status

38、status; int dest = (rank+1)%p; int source = (rank + p -1)%p; if(source = p-1) source = MPI_PROC_NULL; if(dest = 0) dest = MPI_PROC_NULL; MPI_Sendrecv( ,2019年6月,MPI并行程序设计,55/217,阻塞与非阻塞的差别,用户发送缓冲区的重用: 非阻塞的发送:仅当调用了有关结束该发送的语句后才能重用发送缓冲区,否则将导致错误;对于接收方,与此相同,仅当确认该接收请求已完成后才能使用。所以对于非阻塞操作,要先调用等待MPI_Wait()或测试MP

39、I_Test()函数来结束或判断该请求,然后再向缓冲区中写入新内容或读取新内容。 阻塞发送将发生阻塞,直到通讯完成. 非阻塞可将通讯交由后台处理,通信与计算可重叠. 发送语句的前缀由MPI_改为MPI_I, I:immediate: 标准模式:MPI_Send()-MPI_Isend() Buffer模式:MPI_Bsend()-MPI_Ibsend() ,2019年6月,MPI并行程序设计,56/217,非阻塞发送与接收,int MPI_Isend(void* buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm

40、 comm, MPI_Request *request) IN buf 发送缓冲区的起始地址 IN count 发送缓冲区的大小(发送元素个数) IN datatype 发送缓冲区数据的数据类型 IN dest 目的进程的秩 IN tag 消息标签 IN comm 通信空间/通信子 OUT request 非阻塞通信完成对象(句柄) int MPI_Irecv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Request* request),2019年6月,MPI并行程序

41、设计,57/217,非阻塞标准发送和接收,2019年6月,MPI并行程序设计,58/217,通信的完成(常用于非阻塞通信),发送的完成: 代表发送缓冲区中的数据已送出,发送缓冲区可以重用。它并不代表数据已被接收方接收。数据有可能被缓冲; 接收的完成:代表数据已经写入接收缓冲区。接收者可访问接收缓冲区。 通过MPI_Wait()和MPI_Test()来判断通信是否已经完成;,2019年6月,MPI并行程序设计,59/217,MPI_Wait()及应用示例,int MPI_Wait(MPI_Request* request, MPI_Status * status); 当request标识的通信结

42、束后,MPI_Wait()才返回。如果通信是非阻塞的,返回时request = MPI_REQUEST_NULL;函数调用是非本地的; MPI_Request request; MPI_Status status; int x,y; if(rank = 0) MPI_Isend( ,2019年6月,MPI并行程序设计,60/217,MPI_Test()及应用示例,/int MPI_Test(MPI_Request *request,int *flag, MPI_Status *status); MPI_Request request; MPI_Status status; int x,y,fl

43、ag; if(rank = 0) MPI_Isend( ,2019年6月,MPI并行程序设计,61/217,消息探测 -Probe函数(适用于阻塞与非阻塞),MPI_Probe()和MPI_Iprobe()函数探测接收消息的内容。用户根据探测到的消息内容决定如何接收这些消息,如根据消息大小分配缓冲区等。前者为阻塞方式,即只有探测到匹配的消息才返回;后者为非阻塞,即无论探测到与否均立即返回. int MPI_Probe(int source, int tag, MPI_Comm comm, MPI_Status* status) int MPI_Iprobe(int source, int ta

44、g, MPI_Comm comm, int*flag, MPI_Status* status) IN source 数据源的rank,可以是MPI_ANY_SOURCE IN tag 数据标签,可以是MPI_ANY_TAG IN comm 通信空间/通信子 OUT flag 布尔值,表示探测到与否(只用于非阻塞方式) OUT status status对象,包含探测到消息的内容,2019年6月,MPI并行程序设计,62/217,MPI_Probe应用示例,int x; float y; MPI_Comm_rank(comm, ,2019年6月,MPI并行程序设计,63/217,讲座内容提示,基

45、本的MPI 基本概念 点到点通信(Point to point) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序的编译和运行 深入MPI 用户自定义(/派生)数据类型(User-defined(Derived) data type) 事实上MPI的所有数据类型均为MPI自定义类型 支持异构系统 允许消息来自不连续的或类型不一致的存储区(结构,数组散元) 集合通信(Collective) 数据移动,数据聚集,同步 基于point to point 构建 MPI环境管理函数 组,上下文和通信空间/通信子的管理 实例,2019年6月,MPI并行程序设计,64/217,MPI程序的

46、编译,mpicc编译并连接用C语言编写的MPI程序 mpiCC编译并连接用C+编写的MPI程序 mpif77编译并连接用FORTRAN 77编写的MPI程序 mpif90编译并连接用Fortran 90编写的MPI程序 这些命令可以自动提供MPI需要的库,并提供特定的开关选项(用-help查看)。,2019年6月,MPI并行程序设计,65/217,MPI程序的编译,用mpicc编译时,就像用一般的C编译器一样。还可以使用一般的C的编译选项,含义和原来的编译器相同 例如: ./mpicc -c foo.c ./mpicc -o foo foo.o,2019年6月,MPI并行程序设计,66/217

47、,MPI程序的运行,MPI程序的执行步骤一般为: 编译以得到MPI可执行程序(若在同构的系统上,只需编译一次;若系统异构,则要在每一个异构系统上都对MPI源程序进行编译) 将可执行程序拷贝到各个节点机上 通过mpirun命令并行执行MPI程序,2019年6月,MPI并行程序设计,67/217,最简单的MPI运行命令,mpirun np N 其中: N: 同时运行的进程数 : 可执行MPI程序名 例如: mpirun np 6 cpi mpirun np 4 hello,2019年6月,MPI并行程序设计,68/217,一种灵活的执行方式,mpirun p4pg 为配置文件,其格式为: 例如:

48、(注:第一行的0并不表示在node0上没有进程,这里的0特指在node0上启动MPI程序) node0 0 /public0/dair/mpi/cpi node1 1 /public0/dair/mpi/cpi node2 1 /public0/dair/mpi/cpi 这种方式允许可执行程序由不同的名字和不同的路径,2019年6月,MPI并行程序设计,69/217,另一种灵活的执行方式,mpirun machinefile -np 为配置文件,其格式为: 例如: node0 node1 node2 node3,2019年6月,MPI并行程序设计,70/217,完整的MPI运行方式,MPI程序的一般启动方式: mpirun np 完整的MPI运行方式: mpirun mpirun_options options 详细参数信息执行mpirun -help,2019年6月,MPI并行程序设计,71/217,讲座内容提示,基本的MPI 基本概念 点到点通信(Point to point) MPI中API的主要内容,为MPI最基本,最重要的内容 MPI程序

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1