消息传递编程接口MPI.ppt

上传人:牧羊曲112 文档编号:6054421 上传时间:2023-09-18 格式:PPT 页数:41 大小:231KB
返回 下载 相关 举报
消息传递编程接口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页
点击查看更多>>
资源描述

《消息传递编程接口MPI.ppt》由会员分享,可在线阅读,更多相关《消息传递编程接口MPI.ppt(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 的支持

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

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

4、何操作,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_rankmyid=0,MPI_Get_processor_nameproc_name=c0101namelen=5,Writehello,I am proc.0 of 4 on c0101,

5、MPI_Finalize,进程 3,MPI_Init,MPI_Comm_rankmyid=3,MPI_Get_processor_nameproc_name=c0102namelen=5,Writehello,I am proc.3 of 4 on c0102,MPI_Finalize,程序运行结束,进程 1,进程 2,11,MPI 程序分析,在单个结点(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

6、 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,分别完成 MPI 的初始化和结束工作 除 MPI_Wtime 和 MPI_Wtick 外,所有 C 函数调用之后 都将返回一个错误信息码 由于 C 语言的

7、函数调用机制是值传递,所以 MPI 的所有 C 函数中的输出参数用的都是指针,14,MPI 编程惯例,MPI 是按进程组(Process Group)方式工作:所有 MPI 程序在开始时均被认为是在通信器 MPI_COMM_WORLD 所拥有的进程组中工作,之后用户可以根据自己的需要,建立其它的进程组 所有 MPI 的通信一定要在通信器中进行,15,编译与运行,C 编写的 MPI 程序,mpicc o hello hello.c,MPI 程序的编译,MPICH2 中的 mpirun 和 mpiexec 是同一个命令,16,MPI 编程初步数据类型与基本接口,17,MPI 数据类型,MPI 数据

8、类型分:原始数据类型和自定义数据类型,MPI 定义了一些基本数据类型 主要用于消息传递,MPI 数据类型命名规则,以 MPI_ 开头,后面跟 C 语言原始数据类型名,全部为大写!,18,MPI 原始数据类型,自定义数据类型以后再介绍,19,MPI 常量,MPI 定义一组常量,MPI 常量命名规则:全部大写,MPI_MAX_PROCESSOR_NAMEMPI_PROC_NULLMPI_COMM_WORLDMPI_COMM_SELFMPI_COMM_NULLMPI_ANY_SOURCEMPI_ANY_TAGMPI_TAG_UBMPI_LBMPI_UBMPI_BOTTOM,20,MPI 常用接口,M

9、PI_INIT MPI_FINALIZE MPI_COMM_RANK MPI_COMM_SIZE MPI_SEND MPI_RECV,MPI_SENDRECV MPI_SENDRECV_REPLACE MPI_GET_COUNT MPI_ABORT MPI_WTIME MPI_GET_PROCESSOR_NAME MPI_MPI_GET_VERSION,21,MPI_INIT,MPI_INIT:MPI 初始化,该函数初始化 MPI 并行程序的执行环境 它必须在调用所有其它 MPI 函数之前被调用(除 MPI_INITIALIZED)在一个 MPI 程序中,只能被调用一次,22,MPI_FINA

10、LIZE,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,MPI_SEND(buf,count,datatype,dest,tag,comm),阻塞型消息发送接口 最基本的点对点通信函数之一,26,MPI_SEND,MPI_S

11、END 将缓冲区中 count 个 datatype 类型的数据发给进程号为 dest 的目的进程 这里 count 是元素个数,即指定数据类型的个数,不是字节数,数据的起始地址为 buf datatype 是 MPI 数据类型 本次发送的消息标签是 tag,使用标签的目的是把本次发送的消息和本进程向同一目的进程发送的其它消息区别开来 dest 的取值范围为0np-1(np 表示通信器 comm 中的进程数)或 MPI_PROC_NULL,tag 的取值为 0 MPI_TAG_UB 该函数可以发送各种类型的数据,如整型、实型、字符等,MPI_SEND(buf,count,datatype,de

12、st,tag,comm),点对点通信是 MPI 通信机制的基础,27,MPI_RECV,MPI_RECV(buf,count,datatype,source,tag,comm,status),阻塞型消息接收接口 最基本的点对点通信函数之一,28,MPI_RECV,从指定的进程 source 接收不超过 count 个 datatype 类型的数据,并把它放到缓冲区中,起始位置为 buf,本次消息的标识为 tag source 取值范围为 0 np-1,或 MPI_ANY_SOURCE,或 MPI_PROC_NULL,tag 取值为 0MPI_TAG_UB 或 MPI_ANY_TAG 接收消息时

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

14、实现方式一:0 号进程先发送后接收,其它进程先接收后发送,实现方式二:奇数号进程先发送后接收,偶数号进程先接收后发送,例:ex4sendrecv01.c,ex4sendrecv02.c,上机作业,在使用阻塞型函数传递消息时要避免死锁!,30,MPI 发送接收,MPI_SEND(buf,count,datatype,dest,tag,comm),MPI_RECV(buf,count,datatype,source,tag,comm,status),所发送的数据的实际数据类型、发送函数中的数据类型、接收函数中的数据类型要一致!,31,MPI 常用接口,MPI_GET_PROCESSOR_NAME

15、MPI_SENDRECV MPI_SENDRECV_REPLACE MPI_GET_COUNT MPI_ABORT MPI_WTIME MPI_MPI_GET_VERSION,32,获取结点主机名,MPI_GET_PROCESSOR_NAME(name,namelen),该函数返回进程所在结点的主机名,33,MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf,recvcount,recvtype,source,recvtag,comm,status),MPI_SENDRECV,发送消息和接收消息组合在一起,34,MPI_SE

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

17、us),功能与 MPI_SENDRECV 类似,但收发消息使用的是同一个缓冲区,例:ex4sendrecv04.c,36,程序示例,例:计算 的值。,采用等步长中矩形公式,其中 n 为积分区间数,h=1/n 为步长,xi=(i+0.5)h 为积分区间的中点 采用 p 个进程同时计算,各自计算其中的一部分,然后再将结果加起来。,例:ex4pi01.c,37,MPI_GET_COUNT,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 的版本号,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号