消息传递编程接口MPI.ppt

上传人:飞猪 文档编号:119087 上传时间:2025-07-10 格式:PPT 页数:41 大小:330.01KB
下载 相关 举报
消息传递编程接口MPI.ppt_第1页
第1页 / 共41页
消息传递编程接口MPI.ppt_第2页
第2页 / 共41页
消息传递编程接口MPI.ppt_第3页
第3页 / 共41页
消息传递编程接口MPI.ppt_第4页
第4页 / 共41页
消息传递编程接口MPI.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、第四讲消息传递编程接口 MPI一、一、MPI 编程基础编程基础1主要内容主要内容q MPI 安装、程序编译与运行安装、程序编译与运行 u MPI 进程进程/进程组进程组u MPI 通信器通信器u MPI 消息消息u MPI 程序基本结构程序基本结构q MPI 编程基础编程基础q MPI 程序编译与运行程序编译与运行q MPI 数据类型数据类型q MPI 几个常用接口几个常用接口 2MPI 介绍介绍q Message Passing Interfacel 消息传递编程标准,目前最为通用的并行编程方式消息传递编程标准,目前最为通用的并行编程方式l 提供一个高效、可扩展、统一的并行编程环境提供一个高

2、效、可扩展、统一的并行编程环境l MPI 是一个库,不是一门语言,是一个库,不是一门语言,MPI 提供库函数提供库函数/过程供过程供 C/FORTRAN 调用调用l MPI 是一种标准或规范的代表,并不是一个具体实现是一种标准或规范的代表,并不是一个具体实现l 所有的并行计算机制造商都提供对所有的并行计算机制造商都提供对 MPI 的支持的支持l MPI 是一种消息传递编程模型是一种消息传递编程模型,最终目的是服务于进程间最终目的是服务于进程间通信这一目标通信这一目标3MPI 介绍介绍l MPI 1.0:MPICH 1.2.7p1l MPI 2.0:MPICH2 1.1.1p1q MPI 的实现

3、的实现 免费版本免费版本l 1994 年公布年公布 MPI 1.0 标准,标准,1998 年公布年公布 2.0 标准标准 q MPI 的目标的目标l 较高的通信性能;较高的通信性能;l 较好的程序可移植性;较好的程序可移植性;l 强大的功能强大的功能q MPI 商业版本商业版本l 一些厂商也提供商业版的一些厂商也提供商业版的 MPI 系统,许多是在系统,许多是在 MPICH 的基础上优化产生的的基础上优化产生的4MPI 下载与安装下载与安装q MPICH 下载下载http:/www-unix.mcs.anl.gov/mpi/q MPICH 的安装的安装l 参考参考 MPICH Install

4、Guideq MPICH 的使用的使用l 参考参考 MPICH User Guide5进程与通信器进程与通信器q MPI 进程进程l MPI 程序中一个独立参与通信的个体程序中一个独立参与通信的个体q MPI 进程组进程组l MPI 程序中由程序中由部分部分或或全部全部进程构成的进程构成的有序集合有序集合l 每个进程都被赋予一个每个进程都被赋予一个所在进程组所在进程组中中唯一唯一的的序号序号(rank),用于在该组中标识该进程,称为用于在该组中标识该进程,称为进程号进程号,取值从,取值从 0 开始开始进程的具体个数由用户在递交并行任务时指定进程的具体个数由用户在递交并行任务时指定q MPI 通

5、信器通信器/通信子(通信子(Communicator)l MPI 程序中进程间的通信程序中进程间的通信必须必须通过通信器进行通过通信器进行l 通信器分为通信器分为域内通信器域内通信器(同一进程组内的通信)和(同一进程组内的通信)和域间通域间通信器信器(不同进程组的进程间的通信)(不同进程组的进程间的通信)6进程与通信器进程与通信器u MPI 程序中,一个程序中,一个 MPI 进程进程 由一个进程组和在该组中的进程号唯一确定;或由一个进程组和在该组中的进程号唯一确定;或 由一个通信器和在该通信器中的进程号唯一确定由一个通信器和在该通信器中的进程号唯一确定u 进程号是相对进程组或通信器而言的,同一

6、进程在不进程号是相对进程组或通信器而言的,同一进程在不 同的进程组或通信器中可以有不同的进程号同的进程组或通信器中可以有不同的进程号l MPI 程序启动时自动建立两个通信器:程序启动时自动建立两个通信器:MPI_COMM_WORLD :包含程序中所有:包含程序中所有 MPI 进程进程 MPI_COMM_SELF:单个进程独自构成,仅包含自己:单个进程独自构成,仅包含自己u 进程号是在进程组或通信器被创建时赋予的进程号是在进程组或通信器被创建时赋予的u 空进程:空进程:MPI_PROC_NULLu 与空进程通信时不做任何操作与空进程通信时不做任何操作7MPI 消息消息q 消息(消息(messag

7、e)l 一个消息指一个消息指进程间进行的一次数据交换进程间进行的一次数据交换l 一个消息由一个消息由 通信器、源地址、目的地址、消息标签、通信器、源地址、目的地址、消息标签、和和数据数据构成构成发送方发送方接受方接受方8第一个第一个 MPI C 程序程序#include mpi.h#include int main(int argc,char*argv)int myid,np,namelen;char proc_nameMPI_MAX_PROCESSOR_NAME;MPI_Init(&argc,&argv);MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Com

8、m_size(MPI_COMM_WORLD,&np);MPI_Get_processor_name(proc_name,&namelen);fprintf(stderr,Hello,I am proc.%d of%d on%sn,myid,np,proc_name);MPI_Finalize();MPI 的初始化和结束的初始化和结束mpi.h 是是 MPI 相对于相对于C语言的头文件语言的头文件调用调用MPI 函数时必须包含函数时必须包含 MPI 头文件头文件获取运行本进程所在的结点的主机名获取运行本进程所在的结点的主机名获取本进程的进程号获取本进程的进程号进程号取值范围为进程号取值范围为 0

9、np-1获取所有参加运算的进程的个数获取所有参加运算的进程的个数MPI 预定义的宏:所允许的机器名字的最大长度预定义的宏:所允许的机器名字的最大长度9MPI 程序执行过程程序执行过程启动启动 4 个进程运行可执行文件个进程运行可执行文件 hello进程进程 0MPI_InitMPI_Comm_rankmyid=0MPI_Get_processor_nameproc_name=c0101namelen=5Writehello,I am proc.0 of 4 on c0101MPI_Finalize进程进程 3MPI_InitMPI_Comm_rankmyid=3MPI_Get_process

10、or_nameproc_name=c0102namelen=5Writehello,I am proc.3 of 4 on c0102MPI_Finalize 程序运行结束程序运行结束 进程进程 1进程进程 210MPI 程序分析程序分析u 在单个结点在单个结点(c0101)上,开上,开 4 个进程的运行结果个进程的运行结果Hello,I am Proc.1 of 4 on c0101Hello,I am Proc.0 of 4 on c0101Hello,I am Proc.2 of 4 on c0101Hello,I am Proc.3 of 4 on c0101u 在四个结点上,开在四个

11、结点上,开 4 个进程的运行结果个进程的运行结果Hello,I am Proc.1 of 4 on c0101Hello,I am Proc.3 of 4 on c0102Hello,I am Proc.2 of 4 on c0104Hello,I am Proc.0 of 4 on c010311MPI 程序执行过程程序执行过程12MPI 编程惯例编程惯例l MPI 的所有常量、变量与函数均以的所有常量、变量与函数均以 MPI_ 开头开头l MPI 的的 C 语言接口为语言接口为函数函数l 在在 C 程序中,所有常数的定义除下划线外一律由大写字母程序中,所有常数的定义除下划线外一律由大写字母

12、 组成,在函数和数据类型定义中组成,在函数和数据类型定义中,接接 MPI_ 之后的第一个字之后的第一个字 母大写,其余全部为小写字母,即母大写,其余全部为小写字母,即 MPI_Xxxx_xxx 形式形式l MPI 程序的开始和结束必须是程序的开始和结束必须是 MPI_Init 和和 MPI_Finalize,分别完成,分别完成 MPI 的初始化和结束工作的初始化和结束工作l 除除 MPI_Wtime 和和 MPI_Wtick 外,所有外,所有 C 函数调用之后函数调用之后 都将返回一个错误信息码都将返回一个错误信息码l 由于由于 C 语言的函数调用机制是值传递,所以语言的函数调用机制是值传递,

13、所以 MPI 的所有的所有 C 函数中的函数中的输出参数输出参数用的都是用的都是指针指针13MPI 编程惯例编程惯例l MPI 是按进程组是按进程组(Process Group)方式工作:方式工作:所有所有 MPI 程序在开始时均被认为是在通信器程序在开始时均被认为是在通信器 MPI_COMM_WORLD 所拥有的进程组中工作,所拥有的进程组中工作,之后用户可以根据自己的需要,建立其它的进程组之后用户可以根据自己的需要,建立其它的进程组l 所有所有 MPI 的通信一定要在的通信一定要在通信器通信器中进行中进行14编译与运行编译与运行l C 编写的编写的 MPI 程序程序mpicc o hell

14、o hello.cq MPI 程序的编译程序的编译q MPI 程序的运行程序的运行l mpirun (old,使用,使用 rsh 启动启动 MPI 进程)进程)l mpiexec(new,使用,使用 ssh 启动启动 MPI 进程,更安全)进程,更安全)MPICH2 中的中的 mpirun 和和 mpiexec 是同一个命令是同一个命令15MPI 编程初步编程初步数据类型与基本接口数据类型与基本接口16MPI 数据类型数据类型MPI 数据类型分:数据类型分:原始数据类型原始数据类型和和自定义数据类型自定义数据类型u MPI 定义了一些基本数据类型定义了一些基本数据类型 主要主要用于消息传递用于

15、消息传递 n MPI 数据类型命名规则数据类型命名规则 以以 MPI_ 开头,后面跟开头,后面跟 C 语言原始数据类型名语言原始数据类型名全部为大写!全部为大写!17MPI 原始数据类型原始数据类型MPI datatypeC datatypeMPI_CHARsigned charMPI_SHORTsigned short intMPI_INTsigned intMPI_LONGsigned long intMPI_UNSIGNED_CHARunsigned charMPI_UNSIGNED_SHORTunsigned short intMPI_UNSIGNED_INTunsigned intM

16、PI_UNSIGNED_LONGunsigned long intMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElong doubleMPI_BYTEMPI_PACKED自定义数据类型以后再介绍自定义数据类型以后再介绍18MPI 常量常量n MPI 定义一组常量定义一组常量 l MPI 常量命名规则:全部大写常量命名规则:全部大写 MPI_MAX_PROCESSOR_NAMEMPI_PROC_NULLMPI_COMM_WORLDMPI_COMM_SELFMPI_COMM_NULLMPI_ANY_SOURCEMPI_ANY_TAGMPI_TAG_UBM

17、PI_LBMPI_UBMPI_BOTTOM 19MPI 常用接口常用接口l MPI_INIT l MPI_FINALIZE l MPI_COMM_RANKl MPI_COMM_SIZEl MPI_SENDl MPI_RECVl MPI_SENDRECV l MPI_SENDRECV_REPLACE l MPI_GET_COUNTl MPI_ABORTl MPI_WTIMEl MPI_GET_PROCESSOR_NAMEl MPI_MPI_GET_VERSION20MPI_INITMPI_INIT:MPI 初始化初始化参数参数无无Cint MPI_Init(int*argc,char*argv)

18、l 该函数初始化该函数初始化 MPI 并行程序的执行环境并行程序的执行环境l 它必须在调用所有其它它必须在调用所有其它 MPI 函数之前被调用函数之前被调用 (除(除 MPI_INITIALIZED)l 在一个在一个 MPI 程序中,只能被调用一次程序中,只能被调用一次21MPI_FINALIZEMPI_FINALIZE:结束结束 MPI 系统系统参数参数无无Cint MPI_Finalize(void)l 该函数清除该函数清除 MPI 环境的所有状态环境的所有状态l 它被调用后,所有它被调用后,所有MPI 函数都不能再调用,函数都不能再调用,包括包括 MPI_INIT22MPI_COMM_R

19、ANK MPI_COMM_RANK(comm,rank)参数参数IN comm通信器通信器OUT rank 本进程在通信器本进程在通信器 comm 中的进程号中的进程号Cint MPI_Comm_rank(MPI_Comm comm,int*rank)l 该函数返回本进程在指定通信器中的进程号该函数返回本进程在指定通信器中的进程号23MPI_COMM_SIZEMPI_COMM_SIZE(comm,size)参数参数IN comm通信器通信器OUT size 该通信器该通信器 comm 中的进程数中的进程数Cint MPI_Comm_size(MPI_Comm comm,int*size)l 该

20、函数返回指定通信器所包含的所有进程个数该函数返回指定通信器所包含的所有进程个数24MPI_SENDMPI_SEND(buf,count,datatype,dest,tag,comm)参数参数IN buf 所发送消息的所发送消息的首地址首地址IN count 将发送的数据的个数将发送的数据的个数IN datatype 发送数据的数据类型发送数据的数据类型IN dest 接收消息的进程的标识号接收消息的进程的标识号IN tag 消息标签消息标签IN comm 通信通信器器Cint MPI_Send(void*buf,int count,MPI_Datatype datatype,int dest,

21、int tag,MPI_Comm comm)l 阻塞型阻塞型消息消息发送发送接口接口l 最基本的点对点通信函数之一最基本的点对点通信函数之一25MPI_SENDl MPI_SEND 将缓冲区中将缓冲区中 count 个个 datatype 类型的数据发类型的数据发给进程号为给进程号为 dest 的目的进程的目的进程l 这里这里 count 是元素个数,即指定数据类型的个数,不是字是元素个数,即指定数据类型的个数,不是字节数,数据的起始地址为节数,数据的起始地址为 bufl datatype 是是 MPI 数据类型数据类型l 本次发送的消息标签是本次发送的消息标签是 tag,使用标签的目的是把本

22、次发送,使用标签的目的是把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来的消息和本进程向同一目的进程发送的其它消息区别开来l dest 的取值范围为的取值范围为0np-1(np 表示通信器表示通信器 comm 中的进中的进程数程数)或或 MPI_PROC_NULL,tag 的取值为的取值为 0 MPI_TAG_UBl 该函数可以发送各种类型的数据,如整型、实型、字符等该函数可以发送各种类型的数据,如整型、实型、字符等MPI_SEND(buf,count,datatype,dest,tag,comm)l 点对点通信是点对点通信是 MPI 通信机制的基础通信机制的基础26MPI_REC

23、V MPI_RECV(buf,count,datatype,source,tag,comm,status)参数参数OUT buf 接收接收消息消息数据的首地址数据的首地址IN count 接收接收数据的数据的最大最大个数个数IN datatype 接收接收数据的数据类型数据的数据类型IN source 发送发送消息的进程的标识号消息的进程的标识号IN tag 消息标签消息标签IN comm 通信通信器器OUT status 返回状态返回状态Cint MPI_Recv(void*buf,int count,MPI_Datatype datatype,int source,int tag,MPI_

24、Comm comm,MPI_Status*status)l 阻塞型阻塞型消息消息接收接收接口接口l 最基本的点对点通信函数之一最基本的点对点通信函数之一27MPI_RECVl 从指定的进程从指定的进程 source 接收不超过接收不超过 count 个个 datatype 类类型的数据,并把它放到缓冲区中,起始位置为型的数据,并把它放到缓冲区中,起始位置为 buf,本次消息,本次消息的标识为的标识为 tagl source 取值范围为取值范围为 0 np-1,或,或 MPI_ANY_SOURCE,或,或 MPI_PROC_NULL,tag 取值为取值为 0MPI_TAG_UB 或或 MPI_A

25、NY_TAGl 接收消息时返回的状态接收消息时返回的状态 STATUS,在,在 C 语言中是用结构定义语言中是用结构定义的,的,可供查询的成员可供查询的成员包括包括 MPI_SOURCE,MPI_TAG 和和 MPI_ERROR。l 此外此外,STATUS 还包含接收消息元素的个数,但它不是显式还包含接收消息元素的个数,但它不是显式给出的,需要给出的,需要调用调用函数函数 MPI_GET_COUNT 查询查询 MPI_RECV(buf,count,datatype,source,tag,comm,status)28程序示例程序示例例:例:将每个进程中某个数据发送给下一个进程,并从前一个将每个进

26、程中某个数据发送给下一个进程,并从前一个进程接收一个数据,即进程接收一个数据,即 0 号进程给号进程给 1 号进程发送一个数据,号进程发送一个数据,并从并从 np-1 号进程接收一个数据,号进程接收一个数据,1 号进程从号进程从 0 号进程接收号进程接收一个数据,并向一个数据,并向 2 号进程发送一个数据,以此类推。号进程发送一个数据,以此类推。l 实现方式一:实现方式一:0 号进程先发送后接收,其它进程先接收后发送号进程先发送后接收,其它进程先接收后发送l 实现方式二:实现方式二:奇数奇数号进程先发送后接收,号进程先发送后接收,偶数偶数号进程先接收后发送号进程先接收后发送例:例:ex4sen

27、drecv01.c,ex4sendrecv02.c上机作业上机作业在使用阻塞型函数传递消息时要避免死锁!在使用阻塞型函数传递消息时要避免死锁!29MPI 发送接收发送接收MPI_SEND(buf,count,datatype,dest,tag,comm)MPI_RECV(buf,count,datatype,source,tag,comm,status)消息数据消息数据消息数据消息数据消息信封消息信封消息信封消息信封所发送的数据的实际数据类型、发送所发送的数据的实际数据类型、发送函数中的数据类型、接收函数中的数函数中的数据类型、接收函数中的数据类型要一致!据类型要一致!C:结构:结构statu

28、s.MPI_SOURCEstatus.MPI_TAGstatus.MPI_ERROR30MPI 常用接口常用接口l MPI_GET_PROCESSOR_NAMEl MPI_SENDRECV l MPI_SENDRECV_REPLACE l MPI_GET_COUNTl MPI_ABORTl MPI_WTIMEl MPI_MPI_GET_VERSION31获取获取结点主机名结点主机名 MPI_GET_PROCESSOR_NAME(name,namelen)l 该函数返回进程所在结点的主机名该函数返回进程所在结点的主机名参数参数OUT name 结点主机名结点主机名OUT namelen 主机名的

29、长度主机名的长度Cint MPI_Get_processor_name(char*name,int*namelen)32MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf,recvcount,recvtype,source,recvtag,comm,status)参数参数参见参见 MPI_SEND 和和 MPI_RECVCint MPI_Sendrecv(void*sendbuf,int sendcount,MPI_Datatype sendtype,int dest,int sendtag,void*recvbuf,int

30、 recvcount,MPI_Datatype recvtype,int source,int recvtag,MPI_Comm comm,MPI_Status*status)MPI_SENDRECVl 发送消息和接收消息组合在一起发送消息和接收消息组合在一起33MPI_SENDRECVl 好处是不用考虑先发送还是先接收消息,从而可以避免消息好处是不用考虑先发送还是先接收消息,从而可以避免消息传递过程中可能的死锁传递过程中可能的死锁l sendbuf 和和 recvbuf 必须指向不同的缓冲区必须指向不同的缓冲区例:例:ex4sendrecv03.cMPI_SENDRECV(sendbuf,s

31、endcount,sendtype,dest,sendtag,recvbuf,recvcount,recvtype,source,recvtag,comm,status)34MPI_SENDRECV_REPLACEMPI_SENDRECV_REPLACE(buf,count,datatype,dest,sendtag,source,recvtag,comm,status)l 功能与功能与 MPI_SENDRECV 类似,但收发消息使用的是同一类似,但收发消息使用的是同一个缓冲区个缓冲区例:例:ex4sendrecv04.c参数参数参见参见 MPI_SEND 和和 MPI_RECVCint MP

32、I_Sendrecv(void*buf,int count,MPI_Datatype datatype,int dest,int sendtag,int source,int recvtag,MPI_Comm comm,MPI_Status*status)35程序示例程序示例例:例:计算计算 的值。的值。l 采用等步长中矩形公式,其中采用等步长中矩形公式,其中 n 为积分区间数,为积分区间数,h=1/n 为步长,为步长,xi=(i+0.5)h 为积分区间的中点为积分区间的中点l 采用采用 p 个进程同时计算,各自计算其中的一部分,然后再个进程同时计算,各自计算其中的一部分,然后再将结果加起来。

33、将结果加起来。例:例:ex4pi01.c36MPI_GET_COUNTMPI_GET_COUNT(status,datatype,count)参数参数IN status 接收操作的返回状态接收操作的返回状态IN datatype 接收操作使用的数据类型接收操作使用的数据类型OUT count 接收到的数据个数接收到的数据个数Cint MPI_Get_count(MPI_Status*status,MPI_Datatype datatype,int*count)l 查询实际接收到的数据的信息查询实际接收到的数据的信息37MPI_ABORTMPI_ABORT(comm,errorcode)参数参数

34、IN comm 通信器通信器OUT errorcode 错误码错误码Cint MPI_Abort(MPI_Comm comm,int errorcode)l 异常终止异常终止 MPI 程序的执行,程序的执行,MPI 系统会尽量设法终止通信系统会尽量设法终止通信器中的所有进程器中的所有进程38MPI_WTIMEMPI_WTIME()参数参数无无Cdouble MPI_Wtime(void)l 该函数返回当前的墙钟时间(系统时间)该函数返回当前的墙钟时间(系统时间)例:例:ex4pi02.c39MPI_WTICKMPI_WTICK()参数参数无无Cdouble MPI_Wtick(void)l 该函数返回该函数返回 MPI_WTIME 的时钟精度,单位为秒的时钟精度,单位为秒 MPI_WTIME 和和 MPI_WTICK 是是 MPI 对于对于 C 语语言的仅有的两个返回言的仅有的两个返回双精度值双精度值而非整型错误码而非整型错误码的的 MPI 函数函数!40MPI_GET_VERSIONMPI_GET_VERSION(version,subver)l 该函数返回该函数返回 MPI 的版本号的版本号参数参数OUT version 主版本号主版本号OUT subver 次版本号次版本号Cint MPI_Get_version(int*version,int*subver)41

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

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

宁ICP备18001539号-1