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

上传人:公**** 文档编号:568761370 上传时间:2024-07-26 格式:PPT 页数:40 大小:314KB
返回 下载 相关 举报
第四讲消息传递编程接口MPI_第1页
第1页 / 共40页
第四讲消息传递编程接口MPI_第2页
第2页 / 共40页
第四讲消息传递编程接口MPI_第3页
第3页 / 共40页
第四讲消息传递编程接口MPI_第4页
第4页 / 共40页
第四讲消息传递编程接口MPI_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《第四讲消息传递编程接口MPI》由会员分享,可在线阅读,更多相关《第四讲消息传递编程接口MPI(40页珍藏版)》请在金锄头文库上搜索。

1、宰服账臂喻翰绝无苍筏异梢踏明显曝毒理萨拯翻终基批拆鹊矾太洲祸知芽第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI第四讲消息传递编程接口 MPI一、一、 MPI 编程基础编程基础竭挨批杯鹊焰咬硅挠银章竣冉饮桑专慧港韵阔形赛键后酪渴瑚傀骸炼厂秘第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI主要内容主要内容u MPI 程序基本结构程序基本结构 q MPI 编程基础编程基础q MPI 安装、程序编译与运行安装、程序编译与运行 u MPI 数据类型数据类型u 消息发送和接收消息发送和接收u MPI 一些常用函数一些常用函数圭露亿癣存词稳塑饼奴烧衙复谨渤扮注椭模绊四窖宣桂检帆呐粥渊斑瑚嘱

2、第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 介绍介绍q Message Passing Interfacel 消息传递编程标准,目前最为通用的并行编程方式消息传递编程标准,目前最为通用的并行编程方式l 提供一个高效、可扩展、统一的并行编程环境提供一个高效、可扩展、统一的并行编程环境l MPI 是一个库,不是一门语言,是一个库,不是一门语言,MPI 提供库函数提供库函数/过程过程供供 C/FORTRAN 调用调用l MPI 是一种标准或规范的代表而不特指某一个对它的具是一种标准或规范的代表而不特指某一个对它的具体实现。迄今为止所有的并行计算机制造商都提供对体实现。迄今为止所有

3、的并行计算机制造商都提供对MPI 的支持的支持l MPI 是一种消息传递编程模型,最终目的是服务于进程是一种消息传递编程模型,最终目的是服务于进程间通信这一目标间通信这一目标堂铃虱矗宙粮咕乒窒雀镑岗波适奥盆狼惺难钒摊店帚临逆髓间与碉寿眠佰第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 介绍介绍l MPI 1.0:MPICH 1.2.7l MPI 2.0:MPICH2 1.0.7q MPI 的实现的实现 免费版本免费版本l 1994 年公布年公布 MPI 1.0 标准,标准,1998 年公布年公布 2.0 标准标准 q MPI 的目标的目标l 较高的通信性能;较高的通信性能;l

4、较好的程序可移植性;较好的程序可移植性;l 强大的功能强大的功能q MPI 商业版本商业版本l 一些厂商也提供商业版的一些厂商也提供商业版的 MPI 系统,许多是在系统,许多是在 MPICH 的基础上优化产生的的基础上优化产生的骄纲婉锦追闭扬修佐旷碱滁忘贸履钙即液色铭强喜镰援况瀑马合垢溢井蕾第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 下载与安装下载与安装q MPICH 下载下载http:/www.mpich.org/q MPICH 的安装的安装l 参考参考 MPICH Install Guideq MPICH 的使用的使用l 参考参考 MPICH User Guide涡毯涯

5、谩钟磺劫盼柏靡裙蝗撇插节契赦尺兼异漾么猎糙软梅迁敌富踢艰肆第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 编程基本概念编程基本概念q MPI 进程进程l MPI 程序中一个独立参与通信的个体程序中一个独立参与通信的个体q MPI 进程组进程组l MPI 程序中由程序中由部分部分或或全部全部进程构成的进程构成的有序集合有序集合l 每个进程都被赋予一个每个进程都被赋予一个所在进程组所在进程组中中唯一唯一的的序号序号(rank),用于在该组中标识该进程,称为用于在该组中标识该进程,称为进程号进程号,取值从,取值从 0 开始开始酌屋尿豆袜诉溪座词囱悼颊谱陇俺猫画攻先存实镊客瞳讳膨砂皋车

6、躇垃褂第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 进程与通信器进程与通信器q MPI 通信器通信器/通信子(通信子(Communicator)l MPI 程序中进程间的通信程序中进程间的通信必须必须通过通信器进行通过通信器进行l 通信器分为通信器分为域内通信器域内通信器(同一进程组内的通信)和(同一进程组内的通信)和域间通域间通信器信器(不同进程组的进程间的通信)(不同进程组的进程间的通信)u MPI 程序中,一个程序中,一个 MPI 进程进程 由一个进程组和在该组中的进程号唯一确定;或由一个进程组和在该组中的进程号唯一确定;或 由一个通信器和在该通信器中的进程号唯一确定由

7、一个通信器和在该通信器中的进程号唯一确定u 进程号是相对进程组或通信器而言的,同一进程在不进程号是相对进程组或通信器而言的,同一进程在不 同的进程组或通信器中可以有不同的进程号同的进程组或通信器中可以有不同的进程号l MPI 程序启动时自动建立两个通信器:程序启动时自动建立两个通信器: MPI_COMM_WORLD :包含程序中所有:包含程序中所有 MPI 进程进程 MPI_COMM_SELF :有单个进程独自构成,仅包含自己:有单个进程独自构成,仅包含自己粉枯淫羔侥姻信珐牙徒绍莲灾终桨家作顽畅孤民墓痪砚炳敞盔诱泛碳洲颈第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 消息消息u

8、 进程号是在进程组或通信器被创建时赋予的进程号是在进程组或通信器被创建时赋予的u 空进程:空进程:MPI_PROC_NULLu 与空进程通信时不做任何操作与空进程通信时不做任何操作q 消息(消息(message)l 一个消息指一个消息指进程间进行的一次数据交换进程间进行的一次数据交换l 一个消息由一个消息由通信器、源地址、目的地址、消息标签、通信器、源地址、目的地址、消息标签、 和和数据数据构成构成崩责噬扮撑须幢汹秃帕卜顶潮祈菌匡牧跟傀辟卓座椽垄莲柒怠挫夫挝也慨第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI第一个第一个 MPI Fortran 程序程序 program main in

9、clude mpif.h character * (MPI_MAX_PROCESSOR_NAME) proc_name integer myid, numprocs, namelen, rc, ierr call MPI_INIT( ierr ) call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) call MPI_GET_PROCESSOR_NAME(proc_name, namelen, ierr) write(*,10) myid, nu

10、mprocs, proc_name10 FORMAT(Hello, I am Proc. ,I2, of ,I1, on , 20A) call MPI_FINALIZE(ierr) endmpif.h 是是MPI相对于相对于FORTRAN的头文件的头文件粪秧默嗡妓膨鲜事丧院赎骡蘑秽炎摔堆腔役撑锥榴钉般肪稚湾智府晃穴如第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 程序分析程序分析 所有包含所有包含 MPI 调用的程序调用的程序必须包含必须包含 MPI 头文件头文件 MPI_MAX_PROCESSOR_NAME 是是 MPI 预定义的宏,预定义的宏, 即即 MPI 所允许的机器

11、名字的最大长度所允许的机器名字的最大长度 MPI 程序的开始和结束必须是程序的开始和结束必须是 MPI_INIT 和和 MPI_FINALIZE,分别完成,分别完成 MPI 的初始化和结束工作的初始化和结束工作 MPI_COMM_RANK 得到本进程的进程号得到本进程的进程号 MPI_COMM_SIZE 得到所有参加运算的进程的个数得到所有参加运算的进程的个数 MPI_GET_PROCESSOR_NAME 得到运行本进程所在的得到运行本进程所在的 结点的主机名结点的主机名 进程号取值范围为进程号取值范围为 0, , np-1吩吻堕叮藐菊秆羊益仆鲜嘴翅鹰沸貌介矮犬野孺肖统崇辙寺担枣器纪蝇妖第四讲

12、消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 程序分析程序分析u 在单个结点在单个结点(c1)上,开上,开 4 个进程的运行结果个进程的运行结果Hello, I am Proc. 1 of 4 on c1Hello, I am Proc. 0 of 4 on c1Hello, I am Proc. 2 of 4 on c1Hello, I am Proc. 3 of 4 on c1u 在四个结点上,开在四个结点上,开 4 个进程的运行结果个进程的运行结果Hello, I am Proc. 1 of 4 on c1Hello, I am Proc. 0 of 4 on c2Hello

13、, I am Proc. 2 of 4 on c4Hello, I am Proc. 3 of 4 on c3徊杆面恒仪窑腮歹券匆协步一培亚晃宇驼周撼魁娩厄篡腥义翱栋调谴坟犹第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 程序执行过程程序执行过程启动编译生成的可执行文件启动编译生成的可执行文件 hello进程进程 0MPI_INITMPI_COMM_RANKmyid=0MPI_GET_PROCESSOR_NAMEproc_name=c1namelen=2Writehello, I am proc. 0 of 4 on c1MPI_FINALIZE进程进程 3MPI_INITMP

14、I_COMM_RANKmyid=4MPI_GET_PROCESSOR_NAMEproc_name=c1namelen=2Writehello, I am proc. 3 of 4 on c1MPI_FINALIZE 程序运行结束程序运行结束 进程进程 1进程进程 2磁惦吩渣喻碉衫怠恩仪耪弥首力播办长汝炭粱敏穴房烹现焙屯灾宰第打择第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI第一个第一个 MPI C 程序程序#include mpi.h#include #include int main(argc,argv)int argc;char *argv; int myid, np; int

15、namelen; char proc_nameMPI_MAX_PROCESSOR_NAME; MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&myid); MPI_Comm_size(MPI_COMM_WORLD,&numprocs); 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.h 是是 MPI 相对于相对于C语

16、言的头文件语言的头文件钥唾兔伙米暂膛纠曹幌租曹搐噎奉盾坐厄区睬捍席坪蜒胳仆侨也韩免陌蔬第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 编程的一些惯例编程的一些惯例l MPI 的所有常量、变量与函数的所有常量、变量与函数/过程均以过程均以 MPI_ 开头开头l MPI 的的 C 语言接口为函数,语言接口为函数,FORTRAN 接口为接口为 SUBROUTINE,且对应接口的名称相同,且对应接口的名称相同l 在在 C 程序中,所有常数的定义除下划线外一律由大写字母程序中,所有常数的定义除下划线外一律由大写字母 组成,在函数和数据类型定义中组成,在函数和数据类型定义中, 接接 MPI

17、_ 之后的第一个字之后的第一个字 母大写,其余全部为小写字母,即母大写,其余全部为小写字母,即 MPI_Xxxx_xxx 形式形式l 对于对于 FORTRAN 程序,程序,MPI 函数全部以过程方式调用,函数全部以过程方式调用, 一般全用大写字母表示,即一般全用大写字母表示,即 MPI_XXXX_XXX 形式形式 (FORTRAN 不区分大小写)不区分大小写)l 除除 MPI_WTIME 和和 MPI_WTICK 外,所有外,所有 C 函数调用之后函数调用之后 都将返回一个错误信息码,而都将返回一个错误信息码,而 MPI 的所有的所有 FORTRAN 子子 程序中都有一个哑元参数(程序中都有一

18、个哑元参数(IERR)代表错误码)代表错误码作昏烛告锅惧函正淘竟酷绦骨窝乖挽逐桩锈沧宇鲁誓疲臻谓蝎尉洪脑炽冕第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 编程的一些惯例编程的一些惯例l 由于由于 C 语言的函数调用机制是值传递,所以语言的函数调用机制是值传递,所以 MPI 的所有的所有 C 函数中的函数中的输出参数输出参数用的都是用的都是指针指针l MPI 是按进程组是按进程组(Process Group) 方式工作:方式工作: 所有所有 MPI 程序在开始时均被认为是在通信器程序在开始时均被认为是在通信器 MPI_COMM_WORLD 所拥有的进程组中工作,所拥有的进程组中

19、工作, 之后用户可以根据自己的需要,建立其它的进程组之后用户可以根据自己的需要,建立其它的进程组l 所有所有 MPI 的通信一定要在的通信一定要在通信器通信器中进行中进行l FORTRAN 的数组下标缺省以的数组下标缺省以 1 开始,开始, 而而 C 语言的数组是以语言的数组是以 0 开始开始阑舒剐同球鸽嘱拆妨耘横敝袋韧侣垣偏秃泉烩彩愉阀沽避寞构冷躬裙院实第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 数据类型数据类型u MPI 除了提供除了提供 C 语言函数和语言函数和 FORTRAN子程序子程序之外,还定义了一组常量和之外,还定义了一组常量和 C 变量数据类型变量数据类型

20、n MPI 常量命名规则:常量命名规则:全部大写全部大写 n MPI 变量数据类型命名规则:变量数据类型命名规则:以以 MPI_ 开头,后面跟开头,后面跟 C 语言或语言或 FORTRAN 原原始数据类型名称始数据类型名称n MPI 数据类型:数据类型: 原始数据类型原始数据类型 和和 自定义数据类型自定义数据类型肢桂鹅供驳筋峡睛凸令诣壹蹋毙芒嘘梧惟雅范壳尝宰征驼跑扬敬锅淡湘去第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 原始数据类型原始数据类型MPI datatypeFortran datatypeMPI_INTEGERINTEGERMPI_REALREALMPI_DOUB

21、LE_PRECISIONDOUBLE PRECISIONMPI_COMPLEXCOMPLEXMPI_DOUBLE_COMPLEXDOUBLE COMPLEXMPI_LOGICALLOGICALMPI_CHARACTERCHARACTER(1)MPI_BYTEMPI_PACKEDFORTRAN 77 数据类型数据类型勒爆苹噶炒潦损楷传西冒争荚氧工螺悉敲澎舅讲欺亏排疲边肘乒全孝辆长第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 原始数据类型原始数据类型C 数据类型数据类型MPI datatypeC datatypeMPI_CHARsigned charMPI_SHORTsigned

22、 short intMPI_INTsigned intMPI_LONGsigned long intMPI_UNSIGNED_CHARunsigned charMPI_UNSIGNED_SHORTunsigned short intMPI_UNSIGNED_INTunsigned intMPI_UNSIGNED_LONGunsigned long intMPI_FLOATfloatMPI_DOUBLEdoubleMPI_LONG_DOUBLElong doubleMPI_BYTEMPI_PACKED挽奢耿羌尉平瓤排八降瓣湿昧稳卓堡逞迂呼翟伶赞蹈杉粕作煮丙翟饿喊磺第四讲消息传递编程接口MPI第四

23、讲消息传递编程接口MPIMPI 原始数据类型原始数据类型附加的附加的MPI数据类型数据类型相应的相应的C数据类型数据类型MPI_LONG_LONG_INT long long int某些某些 MPI 系统还支持一些附加数据类型系统还支持一些附加数据类型附加的附加的MPI数据类型数据类型相应的相应的FORTRAN77数据类型数据类型MPI_REAL2REAL*2MPI_REAL4REAL*4MPI_REAL8REAL*8MPI_INTEGER1INTEGER*1MPI_INTEGER2INTEGER*2MPI_INTEGER4INTEGER*4挥俯龙喘检瞎摇侄颂阎溅驳闽洛头缓列矩闭眼捡拾抽超气鸽

24、兼捕隆纫门括第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 最常用的六个接口最常用的六个接口u MPI_INIT u MPI_FINALIZE u MPI_COMM_RANKu MPI_COMM_SIZEu MPI_SENDu MPI_RECV难忻膳翻榷瓜旷淬锌峨靶浙廉矗站带磷首咒貌通丢米阎遇瘫冠病偏障喊方第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_INITu MPI_INIT:MPI 初始化初始化参数参数无无Cint MPI_Init(int *argc, char *argv)F77MPI_INIT(IERR)INTEGER IERRl 该函数初始化该函

25、数初始化 MPI 并行程序的执行环境,它必须在调用所并行程序的执行环境,它必须在调用所有其它有其它 MPI 函数(除函数(除 MPI_INITIALIZED)之前被调用,并)之前被调用,并且在一个且在一个 MPI 程序中,只能被调用一次程序中,只能被调用一次淳表乖为邀产今格荚担鳃孙胚梆晓宰域装泞嚼顿胶篇抒莹蜂氨水却恢碰硷第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_FINALIZEu MPI_FINALIZE:结束结束 MPI 系统系统参数参数无无Cint MPI_Finalize(void)F77MPI_FINALIZE(IERR)INTEGER IERRl 该函数清除该函

26、数清除 MPI 环境的所有状态。即一但它被调用,所有环境的所有状态。即一但它被调用,所有MPI 函数都不能再调用,其中包括函数都不能再调用,其中包括 MPI_INIT蓖餐谣浇疙摇热荷谆浙谐沏娥趴丸懈幌躬辈茵腕某坚糯振嵌仲梆悦肌谩扑第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_COMM_RANKu MPI_COMM_RANK(comm, rank)参数参数IN comm通信器通信器OUT rank 本进程在通信器本进程在通信器 comm 中的进程号中的进程号Cint MPI_Comm_rank(MPI_Comm comm, int *rank)F77MPI_COMM_RANK(

27、COMM, RANK, IERR)INTEGER COMM, RANK, IERRl 该函数返回本进程在指定通信器中的进程号该函数返回本进程在指定通信器中的进程号佰态钒理联柱嗣课剂矿纷烩屡忿羽芥鸡丰制伴凌像扫队诸睡赦荷舰孰足召第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_COMM_SIZEu MPI_COMM_SIZE(comm, size)参数参数IN comm通信器通信器OUT size 该通信器该通信器 comm 中的进程数中的进程数Cint MPI_Comm_size(MPI_Comm comm, int *size)F77MPI_COMM_SIZE(COMM, SI

28、ZE, IERR)INTEGER COMM, SIZE, IERRl 该函数返回指定通信器所包含的进程数该函数返回指定通信器所包含的进程数蔚绍朵镊假寥先才罐甩恫促翔晋投镶巡辞烈竟艰眩猴肾止瓶搀琳搐亚菊珐第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_SEND 点对点通信点对点通信u MPI_SEND(buf,count,datatype,dest,tag,comm)参数参数IN buf 所发送消息的所发送消息的首地址首地址IN count 将发送的数据的个数将发送的数据的个数IN datatype 发送数据的数据类型发送数据的数据类型IN dest 接收消息的进程的标识号接收消

29、息的进程的标识号IN tag 消息标签消息标签IN comm 通信器通信器Cint MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)F77MPI_SEND(BUF,COUNT,DATATYPE,DEST,TAG, COMM, IERR) BUF(*)INTEGER COUNT,DATATYPE,DEST,TAG,COMM,IERR绣勤驾咒蝗颓鲸禁凳滋宋声驮记塌予晴褂梗蔷硷陛担福蓑圾漆揽侈议接袄第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_SEND 点对

30、点通信点对点通信MPI_SEND(buf,count,datatype,dest,tag,comm)l 阻塞型消息阻塞型消息发送发送接口接口l MPI_SEND 将缓冲区中将缓冲区中 count 个个 datatype 类型的数据发类型的数据发给进程号为给进程号为 dest 的目的进程。这里的目的进程。这里 count 是元素个数,即是元素个数,即指定数据类型的个数,不是字节数,数据的起始地址为指定数据类型的个数,不是字节数,数据的起始地址为 buf。本次发送的消息标签是本次发送的消息标签是 tag,使用标签的目的是把本次发送的,使用标签的目的是把本次发送的消息和本进程向同一目的进程发送的其它

31、消息区别开来。其中消息和本进程向同一目的进程发送的其它消息区别开来。其中 dest 的取值范围为的取值范围为0np-1 ( np 表示通信器表示通信器 comm 中的进程中的进程数数) 或或 MPI_PROC_NULL,tag 的取值为的取值为 0 MPI_TAG_UBl 该函数可以发送各种类型的数据,如整型、实型、字符等该函数可以发送各种类型的数据,如整型、实型、字符等l 点对点通信是点对点通信是 MPI 通信机制的基础通信机制的基础琵匈异瞳燕娥慢袖交填它铬锦磷额族锈疮岗鄂当丑闹耀询力殉收削胡井郑第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_RECV 点对点通信点对点通信u

32、 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,

33、MPI_Comm comm,MPI_Status *status)F77MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERR) BUF(*)INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, IERR, STATUS(MPI_STATUS_SIZE)糖辫肄腻错诵涌块崩汀亏折闭炕降毗甫帆奴钩射症漠仕盼眨砾申氯探坏旷第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_RECV 点对点通信点对点通信 MPI_RECV(buf,count,datatype,source,tag,co

34、mm,status)l 阻塞型消息阻塞型消息接收接收接口接口l 从指定的进程从指定的进程 source 接收不超过接收不超过 count 个个 datatype 类类型的数据,并把它放到缓冲区中,起始位置为型的数据,并把它放到缓冲区中,起始位置为 buf,本次消息,本次消息的标识为的标识为 tag。这里。这里 source 的取值范围为的取值范围为 0 np-1,或,或MPI_ANY_SOURCE,或,或 MPI_PROC_NULL,tag 的取值为的取值为 0MPI_TAG_UB 或或 MPI_ANY_TAGl 接收消息时返回的状态接收消息时返回的状态 STATUS,在,在 C 语言中是用结

35、构定义语言中是用结构定义的,在的,在 FORTRAN 中是用数组定义的,其中包括中是用数组定义的,其中包括 MPI_SOURCE,MPI_TAG 和和 MPI_ERROR。此外。此外 STATUS 还还包含接收消息元素的个数,但它不是显式给出的,需要用到后包含接收消息元素的个数,但它不是显式给出的,需要用到后面给出的函数面给出的函数 MPI_GET_COUNT衡伙岛棍吃具主呆喻婉谎呛榔涩岿陨溅晚绎蓟埂振驱性硷缆靡辱尝犁涩漠第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 程序示例程序示例例:例:将每个进程中某个数据发送给下一个进程,并从前一个将每个进程中某个数据发送给下一个进程,

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

37、4sendrecv02.f上机作业上机作业在使用阻塞型函数传递消息时要避免死锁!在使用阻塞型函数传递消息时要避免死锁!邢详模梧添伟续袁新娜揩幸懂水脸蕾蹄盖牌呀感邢匪亥壤镜硕殊斯饶杰寡第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 发送接收发送接收MPI_SEND(buf,count,datatype,dest,tag,comm) MPI_RECV(buf,count,datatype,source,tag,comm,status)消息数据消息数据消息数据消息数据消息信封消息信封消息信封消息信封发送数据类型、通信函发送数据类型、通信函数中的数据类型、接收数中的数据类型、接收的数据

38、类型要一致!的数据类型要一致!C:结构:结构status.MPI_SOURCEstatus.MPI_TAGstatus.MPI_ERRORFORTRAN:数组:数组status(MPI_SOURCE)status(MPI_TAG)status(MPI_ERROR)渗仅督宝忍然奇松签姓恼猪窿甜勒涩秒高述俊下微钥仿浸队见颧孜虏遣丧第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI发送与接收组合进行发送与接收组合进行u MPI_SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype,

39、source, recvtag, comm, status)参数参数略略Cint MPI_Sendrecv(void *sendbuf, int sendcount, MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, int recvcount, MPI_Datatype recvtype, int source, int recvtag, MPI_Comm comm, MPI_Status *status)F77MPI_SENDRECV(SENDBUF, SENDCOUNT, SENDTYPE, DEST, SENDTA

40、G, RECVBUF, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, COMM, STATUS,IERR) SENDBUF(*), RECVBUF(*)INTEGER SENDCOUNT, SENDTYPE, DEST, SENDTAG, RECVCOUNT, RECVTYPE, SOURCE, RECVTAG, COMM, IERR, STATUS(MPI_STATUS_SIZE)读望冷舔栅辅砂胆抚羔也猎贵扁廊篮偷傲甭釉掺屉毖高鳖篓毯拯圆驮刷卵第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_SENDRECVu MPI_SENDRECV(sendb

41、uf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, recvtype, source, recvtag, comm, status)l 这是发送消息和接收消息组合在一起的一个函数,好处是不这是发送消息和接收消息组合在一起的一个函数,好处是不用考虑先发送还是先接收消息,从而可以避免消息传递过程中用考虑先发送还是先接收消息,从而可以避免消息传递过程中的死锁的死锁l sendbuf 和和 recvbuf 必须指向不同的缓冲区必须指向不同的缓冲区例:例:ex4sendrecv03.f腮旧惦别忿升罗匿赡守绽铺亥琉攘窑脸订峨母羡鸳甥母盛咏

42、掘苹旷订境割第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_SENDRECV_REPLACEu MPI_SENDRECV_REPLACE(buf, datatype, dest, sendtag, source, recvtag, comm, status)l 功能与功能与 MPI_SENDRECV 类似,但收发消息使用的是同一类似,但收发消息使用的是同一个缓冲区个缓冲区例:例:ex4sendrecv04.f腺呕萌岂移锌廖丫懦汾抡酥若坦缮宰困护赖胃陇蔓哺阴拆暖佰慷喳寿探溉第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 程序示例程序示例例:例:计算计算 的值。的值

43、。 采用等步长中矩形公式,其中采用等步长中矩形公式,其中 n 为积分区间数,为积分区间数,h = 1/n 为步长,为步长,xi = (i + 0.5) h 为积分区间的中点为积分区间的中点 假设采用假设采用 p 的进程同时计算,各自计算其中的一部分,然的进程同时计算,各自计算其中的一部分,然后再将结果加起来。后再将结果加起来。例:例:ex4pi.fmpif77 -Wno-globals o ex4pi ex4pi.f枚月鸽涌流肚翠哪膘冯隅脐衰此漂女肖骂较撕值酞曼闯粱砌瓷喷虱石耸位第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI_GET_COUNTu MPI_GET_COUNT(s

44、tatus, datatype, count)参数参数IN status 接收操作的返回状态接收操作的返回状态IN datatype 接收操作使用的数据类型接收操作使用的数据类型OUT count 接收到的数据个数接收到的数据个数Cint MPI_Get_count(MPI_Status *status, MPI_Datatype datatype, int *count)F77MPI_GET_COUNT(STATUS,DATATYPE,COUNT,IERR)INTEGER DATATYPE,COUNT,IERR, STATUS(MPI_STATUS_SIZE)l 查询实际接收到的数据信息查询

45、实际接收到的数据信息俊千横庇戴燕彼煎征盎擒逼你冻岩茄律烫郡砧梗铣邱痰轩歌廖绥植普硼套第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 异常终止异常终止u MPI_ABORT(comm, errorcode)参数参数IN comm 通信器通信器OUT errorcode 错误码错误码Cint MPI_Abort(MPI_Comm comm,int errorcode)F77MPI_ABORT(COMM, ERRORCODE, IERR)INTEGER COMM, ERRORCODE, IERRl 异常终止异常终止 MPI 程序的执行,程序的执行,MPI 系统会尽量设法终止通信系统会

46、尽量设法终止通信器中的所有进程器中的所有进程陛观钟斌辽箭蝉炮擦兄汹昭漳蹦烘撬员峨踊佛余钉募量谈耍捡先体俗幂赦第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 计时函数计时函数u MPI_WTIME()参数参数无无Cdouble MPI_Wtime(void)F77DOUBLE PRECISION MPI_WTIME()l 该函数返回当前的墙钟时间该函数返回当前的墙钟时间刊陋拖瞧糯肤痪姐虞弄谐瘴毙秃咸重航搐鞍极吸送遍烂挣免超顺裹捕尉颧第四讲消息传递编程接口MPI第四讲消息传递编程接口MPIMPI 计时函数计时函数u MPI_WTICK()参数参数无无Cdouble MPI_Wtic

47、k(void)F77DOUBLE PRECISION MPI_WTICK()l 该函数返回该函数返回 MPI_WTIME 的时钟精度,单位为秒的时钟精度,单位为秒MPI_WTIME 和和 MPI_WTICK 是是 C 中仅有的两个返回双精度中仅有的两个返回双精度值而非整型错误码的值而非整型错误码的 MPI 函数函数;它们也是;它们也是 FORTRAN 中仅有中仅有的两个的两个 FUNCTION 形式的接口!形式的接口!官叁讣啼饺抉乃梁趁紧止卯撒校畅旧聚股肚遁烽距勿岁烹蹬揍袋赐拷绵确第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI获取结点主机名获取结点主机名u MPI_GET_PROCE

48、SSOR_NAME(name, namelen)l 该函数返回进程所在结点的主机名该函数返回进程所在结点的主机名参数参数OUT name 结点主机名结点主机名OUT namelen 主机名的长度主机名的长度Cint MPI_Get_processor_name(char *name, int *namelen)F77MPI_GET_PROCESSOR_NAME(NAME, NAMELEN, IERR)CHARACTER(*) NAMEINTEGER NAMELEN, IERR谗皿涪瘁糕瞬禹胯涪慕蛀萝暮结瘪笛董瑞巾蒲耸芳摈臣驰惩毒华买均巳事第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI获取获取 MPI 版本号版本号u MPI_MPI_GET_VERSION(version, subver)l 该函数返回该函数返回 MPI 的版本号的版本号参数参数OUT version 主版本号主版本号OUT subver 次版本号次版本号Cint MPI_Get_version(int *version, int *subver )F77MPI_GET_VERSION(VERSION, SUBVER, IERR)INTEGER VERSION, SUBVER, IERR疟辫芬狼窿妊习琴筏乔梧金蜒课淋押项万涌持羔辈碎季鸿屋蟹球巡脏跌猪第四讲消息传递编程接口MPI第四讲消息传递编程接口MPI

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号