收藏 分享(赏)

第四讲消息传递编程接口 MPI.ppt

上传人:yjrm16270 文档编号:8222715 上传时间:2019-06-15 格式:PPT 页数:41 大小:330KB
下载 相关 举报
第四讲消息传递编程接口 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、1,第四讲 消息传递编程接口 MPI,一、 MPI 编程基础,2,主要内容,MPI 安装、程序编译与运行,MPI 进程 / 进程组MPI 通信器MPI 消息MPI 程序基本结构,MPI 编程基础,MPI 程序编译与运行MPI 数据类型MPI 几个常用接口,3,MPI 介绍,Message Passing Interface,消息传递编程标准,目前最为通用的并行编程方式提供一个高效、可扩展、统一的并行编程环境,MPI 是一个库,不是一门语言,MPI 提供库函数/过程供 C/FORTRAN 调用MPI 是一种标准或规范的代表,并不是一个具体实现所有的并行计算机制造商都提供对 MPI 的支持MPI

2、是一种消息传递编程模型,最终目的是服务于进程间通信这一目标,4,MPI 介绍,MPI 1.0:MPICH 1.2.7p1MPI 2.0:MPICH2 1.1.1p1,MPI 的目标,较高的通信性能;较好的程序可移植性;强大的功能,5,MPI 下载与安装,MPICH 下载,http:/www-unix.mcs.anl.gov/mpi/,6,进程与通信器,MPI 进程,MPI 程序中一个独立参与通信的个体,MPI 进程组,MPI 程序中由部分或全部进程构成的有序集合每个进程都被赋予一个所在进程组中唯一的序号(rank),用于在该组中标识该进程,称为进程号,取值从 0 开始,进程的具体个数由用户在递

3、交并行任务时指定,MPI 通信器/通信子(Communicator),MPI 程序中进程间的通信必须通过通信器进行通信器分为域内通信器(同一进程组内的通信)和域间通信器(不同进程组的进程间的通信),7,进程与通信器,MPI 程序中,一个 MPI 进程 由一个进程组和在该组中的进程号唯一确定;或 由一个通信器和在该通信器中的进程号唯一确定,进程号是相对进程组或通信器而言的,同一进程在不 同的进程组或通信器中可以有不同的进程号,MPI 程序启动时自动建立两个通信器: MPI_COMM_WORLD :包含程序中所有 MPI 进程 MPI_COMM_SELF :单个进程独自构成,仅包含自己,进程号是在

4、进程组或通信器被创建时赋予的空进程:MPI_PROC_NULL与空进程通信时不做任何操作,8,MPI 消息,9,第一个 MPI C 程序,#include “mpi.h“ #include int main(int argc, char *argv) int myid, np, namelen;char proc_nameMPI_MAX_PROCESSOR_NAME;MPI_Init( ,10,MPI 程序执行过程,启动 4 个进程运行可执行文件 hello,进程 0,MPI_Init,MPI_Comm_rank myid=0,MPI_Get_processor_name proc_name=

5、c0101 namelen=5,Write hello, I am proc. 0 of 4 on c0101,MPI_Finalize,进程 3,MPI_Init,MPI_Comm_rank myid=3,MPI_Get_processor_name proc_name=c0102 namelen=5,Write hello, I am proc. 3 of 4 on c0102,MPI_Finalize, ,程序运行结束, ,进程 1,进程 2,11,MPI 程序分析,在单个结点(c0101)上,开 4 个进程的运行结果,Hello, I am Proc. 1 of 4 on c0101

6、Hello, I am Proc. 0 of 4 on c0101 Hello, I am Proc. 2 of 4 on c0101 Hello, I am Proc. 3 of 4 on c0101,12,MPI 程序执行过程,13,MPI 编程惯例,MPI 的所有常量、变量与函数均以 MPI_ 开头MPI 的 C 语言接口为函数在 C 程序中,所有常数的定义除下划线外一律由大写字母 组成,在函数和数据类型定义中, 接 MPI_ 之后的第一个字 母大写,其余全部为小写字母,即 MPI_Xxxx_xxx 形式MPI 程序的开始和结束必须是 MPI_Init 和 MPI_Finalize,分别

7、完成 MPI 的初始化和结束工作除 MPI_Wtime 和 MPI_Wtick 外,所有 C 函数调用之后 都将返回一个错误信息码由于 C 语言的函数调用机制是值传递,所以 MPI 的所有 C 函数中的输出参数用的都是指针,14,MPI 编程惯例,MPI 是按进程组(Process Group) 方式工作: 所有 MPI 程序在开始时均被认为是在通信器 MPI_COMM_WORLD 所拥有的进程组中工作, 之后用户可以根据自己的需要,建立其它的进程组所有 MPI 的通信一定要在通信器中进行,15,编译与运行,C 编写的 MPI 程序,mpicc o hello hello.c,MPI 程序的编

8、译,MPICH2 中的 mpirun 和 mpiexec 是同一个命令,16,MPI 编程初步 数据类型与基本接口,17,MPI 数据类型,MPI 数据类型分: 原始数据类型和自定义数据类型,MPI 定义了一些基本数据类型 主要用于消息传递,MPI 数据类型命名规则,以 MPI_ 开头,后面跟 C 语言原始数据类型名,全部为大写!,18,MPI 原始数据类型,自定义数据类型以后再介绍,19,MPI 常量,MPI 定义一组常量,MPI 常量命名规则:全部大写,MPI_MAX_PROCESSOR_NAME MPI_PROC_NULL MPI_COMM_WORLD MPI_COMM_SELF MPI

9、_COMM_NULL MPI_ANY_SOURCE MPI_ANY_TAG MPI_TAG_UB MPI_LB MPI_UB MPI_BOTTOM ,20,MPI 常用接口,MPI_INIT MPI_FINALIZE MPI_COMM_RANKMPI_COMM_SIZEMPI_SENDMPI_RECV,MPI_SENDRECV MPI_SENDRECV_REPLACE MPI_GET_COUNTMPI_ABORTMPI_WTIMEMPI_GET_PROCESSOR_NAMEMPI_MPI_GET_VERSION,21,MPI_INIT,MPI_INIT:MPI 初始化,该函数初始化 MPI 并

10、行程序的执行环境它必须在调用所有其它 MPI 函数之前被调用 (除 MPI_INITIALIZED)在一个 MPI 程序中,只能被调用一次,22,MPI_FINALIZE,MPI_FINALIZE:结束 MPI 系统,该函数清除 MPI 环境的所有状态它被调用后,所有MPI 函数都不能再调用, 包括 MPI_INIT,23,MPI_COMM_RANK,MPI_COMM_RANK(comm, rank),该函数返回本进程在指定通信器中的进程号,24,MPI_COMM_SIZE,MPI_COMM_SIZE(comm, size),该函数返回指定通信器所包含的所有进程个数,25,MPI_SEND,M

11、PI_SEND(buf,count,datatype,dest,tag,comm),阻塞型消息发送接口最基本的点对点通信函数之一,26,MPI_SEND,MPI_SEND 将缓冲区中 count 个 datatype 类型的数据发给进程号为 dest 的目的进程这里 count 是元素个数,即指定数据类型的个数,不是字节数,数据的起始地址为 bufdatatype 是 MPI 数据类型本次发送的消息标签是 tag,使用标签的目的是把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来dest 的取值范围为0np-1 ( np 表示通信器 comm 中的进程数) 或 MPI_PROC_NU

12、LL,tag 的取值为 0 MPI_TAG_UB该函数可以发送各种类型的数据,如整型、实型、字符等,MPI_SEND(buf,count,datatype,dest,tag,comm),点对点通信是 MPI 通信机制的基础,27,MPI_RECV,MPI_RECV(buf,count,datatype,source,tag,comm,status),阻塞型消息接收接口最基本的点对点通信函数之一,28,MPI_RECV,从指定的进程 source 接收不超过 count 个 datatype 类型的数据,并把它放到缓冲区中,起始位置为 buf,本次消息的标识为 tagsource 取值范围为 0

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

14、0 号进程给 1 号进程发送一个数据,并从 np-1 号进程接收一个数据,1 号进程从 0 号进程接收一个数据,并向 2 号进程发送一个数据,以此类推。,实现方式一: 0 号进程先发送后接收,其它进程先接收后发送,实现方式二: 奇数号进程先发送后接收,偶数号进程先接收后发送,例:ex4sendrecv01.c, ex4sendrecv02.c,上机作业,在使用阻塞型函数传递消息时要避免死锁!,30,MPI 发送接收,MPI_SEND(buf,count,datatype,dest,tag,comm),MPI_RECV(buf,count,datatype,source,tag,comm,sta

15、tus),所发送的数据的实际数据类型、发送函数中的数据类型、接收函数中的数据类型要一致!,31,MPI 常用接口,MPI_GET_PROCESSOR_NAMEMPI_SENDRECV MPI_SENDRECV_REPLACE MPI_GET_COUNTMPI_ABORTMPI_WTIMEMPI_MPI_GET_VERSION,32,获取结点主机名,MPI_GET_PROCESSOR_NAME(name, namelen),该函数返回进程所在结点的主机名,33,MPI_SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, r

16、ecvcount, recvtype, source, recvtag, comm, status),MPI_SENDRECV,发送消息和接收消息组合在一起,34,MPI_SENDRECV,好处是不用考虑先发送还是先接收消息,从而可以避免消息传递过程中可能的死锁sendbuf 和 recvbuf 必须指向不同的缓冲区,例:ex4sendrecv03.c,MPI_SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm, status),35,

17、MPI_SENDRECV_REPLACE,MPI_SENDRECV_REPLACE(buf, count, datatype, dest, sendtag, source, recvtag, comm, status),功能与 MPI_SENDRECV 类似,但收发消息使用的是同一个缓冲区,例:ex4sendrecv04.c,36,程序示例,例:计算 的值。,采用等步长中矩形公式,其中 n 为积分区间数,h = 1/n 为步长,xi = (i + 0.5) h 为积分区间的中点采用 p 个进程同时计算,各自计算其中的一部分,然后再将结果加起来。,例:ex4pi01.c,37,MPI_GET_C

18、OUNT,MPI_GET_COUNT(status, datatype, count),查询实际接收到的数据的信息,38,MPI_ABORT,MPI_ABORT(comm, errorcode),异常终止 MPI 程序的执行,MPI 系统会尽量设法终止通信器中的所有进程,39,MPI_WTIME,MPI_WTIME(),该函数返回当前的墙钟时间(系统时间),例:ex4pi02.c,40,MPI_WTICK,MPI_WTICK(),该函数返回 MPI_WTIME 的时钟精度,单位为秒,MPI_WTIME 和 MPI_WTICK 是 MPI 对于 C 语言的仅有的两个返回双精度值而非整型错误码的 MPI 函数!,41,MPI_GET_VERSION,MPI_GET_VERSION(version, subver),该函数返回 MPI 的版本号,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报