消息传递编程接口MPI.ppt

上传人:zhu****ei 文档编号:3416217 上传时间:2019-12-14 格式:PPT 页数:41 大小:330KB
返回 下载 相关 举报
消息传递编程接口MPI.ppt_第1页
第1页 / 共41页
消息传递编程接口MPI.ppt_第2页
第2页 / 共41页
消息传递编程接口MPI.ppt_第3页
第3页 / 共41页
点击查看更多>>
资源描述
1,第四讲消息传递编程接口MPI,一、MPI编程基础,2,主要内容,MPI安装、程序编译与运行,MPI进程/进程组MPI通信器MPI消息MPI程序基本结构,MPI编程基础,MPI程序编译与运行MPI数据类型MPI几个常用接口,3,MPI介绍,MessagePassingInterface,消息传递编程标准,目前最为通用的并行编程方式提供一个高效、可扩展、统一的并行编程环境,MPI是一个库,不是一门语言,MPI提供库函数/过程供C/FORTRAN调用MPI是一种标准或规范的代表,并不是一个具体实现所有的并行计算机制造商都提供对MPI的支持MPI是一种消息传递编程模型,最终目的是服务于进程间通信这一目标,4,MPI介绍,MPI1.0:MPICH1.2.7p1MPI2.0:MPICH21.1.1p1,MPI的目标,较高的通信性能;较好的程序可移植性;强大的功能,5,MPI下载与安装,MPICH下载,http:/www-unix.mcs.anl.gov/mpi/,6,进程与通信器,MPI进程,MPI程序中一个独立参与通信的个体,MPI进程组,MPI程序中由部分或全部进程构成的有序集合每个进程都被赋予一个所在进程组中唯一的序号(rank),用于在该组中标识该进程,称为进程号,取值从0开始,进程的具体个数由用户在递交并行任务时指定,MPI通信器/通信子(Communicator),MPI程序中进程间的通信必须通过通信器进行通信器分为域内通信器(同一进程组内的通信)和域间通信器(不同进程组的进程间的通信),7,进程与通信器,MPI程序中,一个MPI进程由一个进程组和在该组中的进程号唯一确定;或由一个通信器和在该通信器中的进程号唯一确定,进程号是相对进程组或通信器而言的,同一进程在不同的进程组或通信器中可以有不同的进程号,MPI程序启动时自动建立两个通信器:MPI_COMM_WORLD:包含程序中所有MPI进程MPI_COMM_SELF:单个进程独自构成,仅包含自己,进程号是在进程组或通信器被创建时赋予的空进程:MPI_PROC_NULL与空进程通信时不做任何操作,8,MPI消息,9,第一个MPIC程序,#includempi.h#includeintmain(intargc,char*argv)intmyid,np,namelen;charproc_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,Iamproc.0of4onc0101,MPI_Finalize,进程3,MPI_Init,MPI_Comm_rankmyid=3,MPI_Get_processor_nameproc_name=c0102namelen=5,Writehello,Iamproc.3of4onc0102,MPI_Finalize,程序运行结束,进程1,进程2,11,MPI程序分析,在单个结点(c0101)上,开4个进程的运行结果,Hello,IamProc.1of4onc0101Hello,IamProc.0of4onc0101Hello,IamProc.2of4onc0101Hello,IamProc.3of4onc0101,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语言的函数调用机制是值传递,所以MPI的所有C函数中的输出参数用的都是指针,14,MPI编程惯例,MPI是按进程组(ProcessGroup)方式工作:所有MPI程序在开始时均被认为是在通信器MPI_COMM_WORLD所拥有的进程组中工作,之后用户可以根据自己的需要,建立其它的进程组所有MPI的通信一定要在通信器中进行,15,编译与运行,C编写的MPI程序,mpiccohellohello.c,MPI程序的编译,MPICH2中的mpirun和mpiexec是同一个命令,16,MPI编程初步数据类型与基本接口,17,MPI数据类型,MPI数据类型分:原始数据类型和自定义数据类型,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常用接口,MPI_INITMPI_FINALIZEMPI_COMM_RANKMPI_COMM_SIZEMPI_SENDMPI_RECV,MPI_SENDRECVMPI_SENDRECV_REPLACEMPI_GET_COUNTMPI_ABORTMPI_WTIMEMPI_GET_PROCESSOR_NAMEMPI_MPI_GET_VERSION,21,MPI_INIT,MPI_INIT:MPI初始化,该函数初始化MPI并行程序的执行环境它必须在调用所有其它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,MPI_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_NULL,tag的取值为0MPI_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取值范围为0np-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,程序示例,例:将每个进程中某个数据发送给下一个进程,并从前一个进程接收一个数据,即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,status),所发送的数据的实际数据类型、发送函数中的数据类型、接收函数中的数据类型要一致!,31,MPI常用接口,MPI_GET_PROCESSOR_NAMEMPI_SENDRECVMPI_SENDRECV_REPLACEMPI_GET_COUNTMPI_ABORTMPI_WTIMEMPI_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_SENDRECV,好处是不用考虑先发送还是先接收消息,从而可以避免消息传递过程中可能的死锁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,status),功能与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的版本号,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!