并行计算-多媒体课件-并行程序设计-ch04MPI编程指南.ppt

上传人:asd****56 文档编号:87456596 上传时间:2023-04-16 格式:PPT 页数:67 大小:549KB
返回 下载 相关 举报
并行计算-多媒体课件-并行程序设计-ch04MPI编程指南.ppt_第1页
第1页 / 共67页
并行计算-多媒体课件-并行程序设计-ch04MPI编程指南.ppt_第2页
第2页 / 共67页
点击查看更多>>
资源描述

《并行计算-多媒体课件-并行程序设计-ch04MPI编程指南.ppt》由会员分享,可在线阅读,更多相关《并行计算-多媒体课件-并行程序设计-ch04MPI编程指南.ppt(67页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、并行算法实践上篇 并行程序设计导论并行算法实践上篇 并行程序设计导论 单元单元单元单元I I 并行程序设计基础并行程序设计基础并行程序设计基础并行程序设计基础 单元单元单元单元II II 并行程序编程指南并行程序编程指南并行程序编程指南并行程序编程指南 单元单元单元单元III III 并行程序开发方法并行程序开发方法并行程序开发方法并行程序开发方法2023/4/82国家高性能计算中心(合肥)单元II 并行程序编程指南 第四章第四章第四章第四章 MPIMPI编程指南编程指南编程指南编程指南 第五章第五章第五章第五章 PVMPVM编程指南编程指南编程指南编程指南 第六章第六章第六章第六章 HPFH

2、PF编程指南编程指南编程指南编程指南 第七章第七章第七章第七章 OpenMPOpenMP编程指南编程指南编程指南编程指南2023/4/83国家高性能计算中心(合肥)第四章第四章 MPI编程指南编程指南 4.1 4.1 引言引言 4.2 64.2 6个基本函数组成的个基本函数组成的MPIMPI子集子集 4.3 4.3 MPIMPI消息消息 4.4 4.4 点对点通信点对点通信 4.5 4.5 群集通信群集通信 4.6 4.6 MPIMPI扩展扩展 4.7 4.7 小结小结2023/4/84国家高性能计算中心(合肥)4.1 引言 MPI(MessageMPI(Message Passing Int

3、erface)Passing Interface)是一个消息传递接是一个消息传递接口标准口标准 MPIMPI提供一个可移植、高效、灵活的消息传递接口库提供一个可移植、高效、灵活的消息传递接口库 MPIMPI以语言独立的形式存在,可运行在不同的操作系统以语言独立的形式存在,可运行在不同的操作系统和硬件平台上和硬件平台上 MPIMPI提供与提供与C C和和FortranFortran语言的绑定语言的绑定2023/4/85国家高性能计算中心(合肥)4.1 引言 MPIMPI的版本的版本 MPICHMPICH LAM(Local Area LAM(Local Area MulticomputerMul

4、ticomputer)CHIMPCHIMP2023/4/86国家高性能计算中心(合肥)4.2 6个基本函数组成的MPI子集#include#include mpi.hmpi.h /*MPI/*MPI头函数,提供了头函数,提供了MPIMPI函数和数据类型的函数和数据类型的定义定义*/intint main(main(intint argcargc,char*,char*argvargv)intint rank,size,tag=1;rank,size,tag=1;intint senddata,recvdatasenddata,recvdata;MPI_StatusMPI_Status stat

5、us;status;MPI_Init(MPI_Init(&argc&argc,&,&argvargv);/*MPI;/*MPI的初始化函数的初始化函数*/MPI_Comm_rank(MPI_Comm_rank(MPI_COMM_WORLDMPI_COMM_WORLD,&rank,&rank);/*;/*该进程的编该进程的编号号*/MPI_Comm_size(MPI_Comm_size(MPI_COMM_WORLDMPI_COMM_WORLD,&size,&size);/*;/*总的进程数总的进程数目目*/2023/4/87国家高性能计算中心(合肥)4.2 6个基本函数组成的MPI子集 if(r

6、ank=0)if(rank=0)senddatasenddata=9999;=9999;MPI_SendMPI_Send(&(&senddatasenddata,1,MPI_INT,1,tag,1,MPI_INT,1,tag,MPI_COMM_WORLDMPI_COMM_WORLD);/*);/*发送数据到进程发送数据到进程1*/1*/if(rank=1)if(rank=1)MPI_Recv(MPI_Recv(&recvdata&recvdata,1,MPI_INT,0,tag,1,MPI_INT,0,tag,MPI_COMM_WORLDMPI_COMM_WORLD,&status,&stat

7、us);/*/*从进程从进程0 0接收数据接收数据*/MPI_FinalizeMPI_Finalize()();/*MPI;/*MPI的结束函数的结束函数*/return(0);return(0);2023/4/88国家高性能计算中心(合肥)4.2 6个基本函数组成的MPI子集 MPIMPI初始化:通过初始化:通过MPI_InitMPI_Init函数进入函数进入MPIMPI环境并完成环境并完成所有的初始化工作。所有的初始化工作。intint MPI_InitMPI_Init(intint*argcargc,char*,char*argvargv)MPIMPI结束:通过结束:通过MPI_Fina

8、lizeMPI_Finalize函数从函数从MPIMPI环境中退出。环境中退出。intint MPI_Finalize(voidMPI_Finalize(void)2023/4/89国家高性能计算中心(合肥)4.2 6个基本函数组成的MPI子集 获取进程的编号:调用获取进程的编号:调用MPI_Comm_rankMPI_Comm_rank函数获得当前函数获得当前进程在指定通信域中的编号,将自身与其他程序区分。进程在指定通信域中的编号,将自身与其他程序区分。intint MPI_Comm_rank(MPI_CommMPI_Comm_rank(MPI_Comm commcomm,intint*ran

9、k)*rank)获取指定通信域的进程数:调用获取指定通信域的进程数:调用MPI_Comm_sizeMPI_Comm_size函数函数获取指定通信域的进程个数,确定自身完成任务比例。获取指定通信域的进程个数,确定自身完成任务比例。intint MPI_Comm_size(MPI_CommMPI_Comm_size(MPI_Comm commcomm,intint*size)*size)2023/4/810国家高性能计算中心(合肥)4.2 6个基本函数组成的MPI子集 消息发送:消息发送:MPI_SendMPI_Send函数用于发送一个消息到目标进函数用于发送一个消息到目标进程。程。intint

10、MPI_Send(voidMPI_Send(void*bufbuf,intint count,count,MPI_DatatypeMPI_Datatype dataytpedataytpe,intint destdest,intint tag,tag,MPI_CommMPI_Comm commcomm)消息接受消息接受:MPI_RecvMPI_Recv函数用于从指定进程接收一个消息函数用于从指定进程接收一个消息 intint MPI_Recv(voidMPI_Recv(void*bufbuf,intint count,count,MPI_DatatypeMPI_Datatype datatye

11、pe,intdatatyepe,int source,source,intint tag,tag,MPI_CommMPI_Comm commcomm,MPI_StatusMPI_Status*status)*status)2023/4/811国家高性能计算中心(合肥)4.3 MPI消息 一个消息好比一封信一个消息好比一封信 消息的内容的内容即信的内容,在消息的内容的内容即信的内容,在MPIMPI中成为中成为消息缓冲消息缓冲(Message Buffer)(Message Buffer)消息的接收发送者即信的地址,在消息的接收发送者即信的地址,在MPIMPI中成为中成为消息封装消息封装(Mess

12、age Envelop)(Message Envelop)2023/4/812国家高性能计算中心(合肥)4.3 MPI消息 MPIMPI中,消息缓冲由中,消息缓冲由三元组三元组 标识标识 消息信封由消息信封由三元组三元组 标识标识 三元组的方式使得三元组的方式使得MPIMPI可以表达更为丰富的信息,功能可以表达更为丰富的信息,功能更强大更强大2023/4/813国家高性能计算中心(合肥)4.3 MPI消息(数据类型)MPIMPI的消息类型分为两种:的消息类型分为两种:预定义类型预定义类型和和派生数据类型派生数据类型(Derived Data TypeDerived Data Type)预定义数

13、据类型预定义数据类型:MPI:MPI支持异构计算支持异构计算(Heterogeneous(Heterogeneous Computing)Computing),它指在不同计算机系统上运行程序,每,它指在不同计算机系统上运行程序,每台计算可能有不同生产厂商,不同操作系统。台计算可能有不同生产厂商,不同操作系统。MPIMPI通过提供预定义数据类型来解决异构计算中的互操作性问通过提供预定义数据类型来解决异构计算中的互操作性问题,建立它与具体语言的对应关系。题,建立它与具体语言的对应关系。派生数据类型派生数据类型:MPIMPI引入派生数据类型来定义由数据类引入派生数据类型来定义由数据类型不同且地址空间

14、不连续的数据项组成的消息。型不同且地址空间不连续的数据项组成的消息。2023/4/814国家高性能计算中心(合肥)4.3 MPI消息(数据类型)2023/4/815国家高性能计算中心(合肥)4.3 MPI消息(数据类型)MPIMPI提供了两个附加类型提供了两个附加类型:MPI_BYTEMPI_BYTE和和MPI_PACKEDMPI_PACKED 。MPI_BYTEMPI_BYTE表示一个字节,所有的计算系统中一个字表示一个字节,所有的计算系统中一个字节都代表节都代表8 8个二进制位。个二进制位。MPI_PACKEDMPI_PACKED预定义数据类型被用来实现传输地址空预定义数据类型被用来实现传

15、输地址空间不连续的数据项间不连续的数据项 。2023/4/816国家高性能计算中心(合肥)4.3 MPI消息(数据类型)double A100;MPI_Pack_size(50,MPI_DOUBLE,comm,&BufferSize);TempBuffer=malloc(BufferSize);j=sizeof(MPI_DOUBLE);Position=0;for(i=0;i50;i+)MPI_Pack(A+i*j,1,MPI_DOUBLE,TempBuffer,BufferSize,&Position,comm);MPI_Send(TempBuffer,Position,MPI_PACKED

16、,destination,tag,comm);MPI_Pack_sizeMPI_Pack_size函数来决定用于存放函数来决定用于存放5050个个MPI_DOUBLEMPI_DOUBLE数据项数据项的临时缓冲区的大小的临时缓冲区的大小 调用调用mallocmalloc函数为这个临时缓冲区分配内存函数为这个临时缓冲区分配内存 forfor循环中将数组循环中将数组A A的的5050个偶序数元素打包成一个消息并存放在临个偶序数元素打包成一个消息并存放在临时缓冲区时缓冲区 2023/4/817国家高性能计算中心(合肥)4.3 MPI消息(数据类型)派生数据类型可以用类型图来描述,这是一种通用的类型描述

17、方派生数据类型可以用类型图来描述,这是一种通用的类型描述方法,它是一系列二元组法,它是一系列二元组 的集合,可以表示成如下的集合,可以表示成如下格式:格式:0,n-1 在派生数据类型中,基类型可以是任何在派生数据类型中,基类型可以是任何MPIMPI预定义数据类型,也预定义数据类型,也可以是其它的派生数据类型,即支持数据类型的嵌套定义。可以是其它的派生数据类型,即支持数据类型的嵌套定义。如图,阴影部分是基类型所占用的空间,其它空间可以是特意留如图,阴影部分是基类型所占用的空间,其它空间可以是特意留下的,也可以是为了方便数据对齐。下的,也可以是为了方便数据对齐。2023/4/818国家高性能计算中

18、心(合肥)4.3 MPI消息(数据类型)MPIMPI提供了全面而强大的提供了全面而强大的构造函数构造函数构造函数构造函数(Constructor Function)(Constructor Function)来定义来定义派生数据类型。派生数据类型。函数名函数名含含义义MPI_Type_contiguous定义由相同数据类型的元素组成的类型MPI_Type_vector定义由成块的元素组成的类型,块之间具有相同间隔MPI_Type_indexed定义由成块的元素组成的类型,块长度和偏移由参数指定MPI_Type_struct定义由不同数据类型的元素组成的类型MPI_Type_commit提交一个

19、派生数据类型MPI_Type_free释放一个派生数据类型2023/4/819国家高性能计算中心(合肥)4.3 MPI消息(数据类型)double A100;double A100;MPI_Data_typeMPI_Data_type EvenElementsEvenElements;MPI_Type_vector(50,1,2,MPI_DOUBLE,&MPI_Type_vector(50,1,2,MPI_DOUBLE,&EvenElementsEvenElements););MPI_Type_commit(&EvenElementsMPI_Type_commit(&EvenElements)

20、;);MPI_Send(AMPI_Send(A,1,1,EvenElementsEvenElements,destination,destination,););首先声明一个类型为首先声明一个类型为MPI_Data_typeMPI_Data_type的变量的变量EvenElementsEvenElements 调用构造函数调用构造函数MPI_Type_vector(countMPI_Type_vector(count,blocklengthblocklength,stride,stride,oldtypeoldtype,&,&newtypenewtype)来定义派生数据类型来定义派生数据类型

21、新的派生数据类型必须先调用函数新的派生数据类型必须先调用函数MPI_Type_commitMPI_Type_commit获得获得MPIMPI系系统的确认后才能调用统的确认后才能调用MPI_SendMPI_Send进行消息发送进行消息发送 2023/4/820国家高性能计算中心(合肥)4.3 MPI消息(数据类型)调用构造函数调用构造函数MPI_Type_vectorMPI_Type_vector(count(count,blocklengthblocklength,stride,stride,oldtypeoldtype,&,&newtypenewtype)来定义派生数据类型。来定义派生数据类

22、型。该该newtypenewtype由由countcount个数据块组成。个数据块组成。而每个数据块由而每个数据块由blocklengthblocklength个个oldtypeoldtype类型的连续数据项组成。类型的连续数据项组成。参数参数stridestride定义了两个连续数据块之间的定义了两个连续数据块之间的oldtypeoldtype类型元素的个数。类型元素的个数。因此,两个块之间的间隔可以由因此,两个块之间的间隔可以由(stride-stride-blocklengthblocklength)来表示。来表示。MPI_Type_vector(50,1,2,MPI_DOUBLE,&E

23、venElements)MPI_Type_vector(50,1,2,MPI_DOUBLE,&EvenElements)函数函数调用产生了派生数据类型调用产生了派生数据类型EvenElementsEvenElements,它由,它由5050个块组成,每个个块组成,每个块由一个双精度数组成,后跟一个块由一个双精度数组成,后跟一个MPI_DOUBLE(8MPI_DOUBLE(8字节字节)的间隔,的间隔,接在后面的是下一块。接在后面的是下一块。2023/4/821国家高性能计算中心(合肥)4.3 MPI消息(消息标签)为什么需要为什么需要消息标签消息标签?当发送者连续发送两个相同类型消息给同一个接收

24、者,如果没有当发送者连续发送两个相同类型消息给同一个接收者,如果没有消息标签,接收者将无法区分这两个消息消息标签,接收者将无法区分这两个消息 这段代码打算传送这段代码打算传送A A的前的前3232个字节进入个字节进入X X,传送,传送B B的前的前1616个字节进个字节进入入Y Y。但是,尽管消息。但是,尽管消息B B后发送,但可能先到达进程后发送,但可能先到达进程QQ,就会被第,就会被第一个接收函数接收在一个接收函数接收在X X中。使用标签可以避免这个错误中。使用标签可以避免这个错误Process P:Send(A,32,Q)Send(B,16,Q)Process Q:recv(X,32,P

25、)recv(Y,16,P)Process P:send(A,32,Q,tag1)send(B,16,Q,tag2)Process Q:recv(X,32,P,tag1)recv(Y,16,P,tag2)2023/4/822国家高性能计算中心(合肥)4.3 MPI消息(消息标签)添加标签使得服添加标签使得服务进程可以对两务进程可以对两个不同的用户进个不同的用户进程分别处理,提程分别处理,提高灵活性高灵活性2023/4/823国家高性能计算中心(合肥)4.3 MPI消息(通信域)通信域通信域通信域通信域(Communicator)(Communicator)包括包括进程组进程组进程组进程组(Pro

26、cess Group)(Process Group)和和通信上下文通信上下文通信上下文通信上下文(Communication Context)(Communication Context)等内容,用于描等内容,用于描述通信进程间的通信关系。述通信进程间的通信关系。通信域分为通信域分为组内通信域组内通信域和和组间通信域组间通信域,分别用来实现,分别用来实现MPIMPI的的组内通信组内通信组内通信组内通信(Intra-communication)(Intra-communication)和和组间通信组间通信组间通信组间通信(Inter-communication)(Inter-communicat

27、ion)。2023/4/824国家高性能计算中心(合肥)4.3 MPI消息(通信域)进程组进程组是进程的是进程的有限、有序集有限、有序集。有限意味着,在一个进程组中,进程的个数有限意味着,在一个进程组中,进程的个数n n是有限的,这里是有限的,这里的的n n称为称为进程组大小进程组大小进程组大小进程组大小(Group Size)(Group Size)。有序意味着,进程的编号是按有序意味着,进程的编号是按0 0,1 1,n-1n-1排列的排列的 一个进程用它在一个通信域一个进程用它在一个通信域(组组)中的编号进行标识。组中的编号进行标识。组的大小和进程编号可以通过调用以下的的大小和进程编号可以

28、通过调用以下的MPIMPI函数获得:函数获得:MPI_Comm_size(communicatorMPI_Comm_size(communicator,&,&group_sizegroup_size)MPI_Comm_rank(communicatorMPI_Comm_rank(communicator,&,&my_rankmy_rank)2023/4/825国家高性能计算中心(合肥)4.3 MPI消息(通信域)通信上下文通信上下文:安全的区别不同的通信以免相互干扰:安全的区别不同的通信以免相互干扰 通信上下文不是显式的对象,只是作为通信域的一部分出现通信上下文不是显式的对象,只是作为通信域的

29、一部分出现 进程组和通信上下文结合形成了进程组和通信上下文结合形成了通信域通信域 MPI_COMM_WORLDMPI_COMM_WORLD是所有进程的集合是所有进程的集合 2023/4/826国家高性能计算中心(合肥)4.3 MPI消息(通信域)MPIMPI提供丰富的函数用于管理通信域提供丰富的函数用于管理通信域 函数名函数名含含义义MPI_Comm_size获取指定通信域中进程的个数MPI_Comm_rank获取当前进程在指定通信域中的编号MPI_Comm_compare 对给定的两个通信域进行比较MPI_Comm_dup复制一个已有的通信域生成一个新的通信域,两者除通信上下文不同外,其它都

30、一样。MPI_Comm_create根据给定的进程组创建一个新的通信域MPI_Comm_split从一个指定通信域分裂出多个子通信域,每个子通信域中的进程都是原通信域中的进程。MPI_Comm_free释放一个通信域2023/4/827国家高性能计算中心(合肥)4.3 MPI消息(通信域)一个在一个在MPIMPI中创建新通信域的例子中创建新通信域的例子 MPI_CommMPI_Comm MyWorldMyWorld,SplitWorldSplitWorld;intint my_rank,group_sizemy_rank,group_size,Color,Key;,Color,Key;MPI_

31、Init(&argcMPI_Init(&argc,&,&argvargv););MPI_Comm_dup(MPI_COMM_WORLD,&MyWorldMPI_Comm_dup(MPI_COMM_WORLD,&MyWorld););MPI_Comm_rank(MyWorld,&my_rankMPI_Comm_rank(MyWorld,&my_rank););MPI_Comm_size(MyWorld,&group_sizeMPI_Comm_size(MyWorld,&group_size););Color=my_rank%3;Color=my_rank%3;Key=my_rank/3;Key=

32、my_rank/3;MPI_Comm_split(MyWorld,Color,Key,&SplitWorldMPI_Comm_split(MyWorld,Color,Key,&SplitWorld););2023/4/828国家高性能计算中心(合肥)4.3 MPI消息(通信域)MPI_Comm_dup(MPI_COMM_WORLD,&MyWorldMPI_Comm_dup(MPI_COMM_WORLD,&MyWorld)创建了一个新的通创建了一个新的通信域信域MyWorldMyWorld,它包含了与原通信域,它包含了与原通信域MPI_COMM_WORLDMPI_COMM_WORLD相同的进程相

33、同的进程组,组,但具有但具有不同的通信上下文。不同的通信上下文。MPI_Comm_split(MyWorld,Color,Key,&SplitWorldMPI_Comm_split(MyWorld,Color,Key,&SplitWorld)函数调用则在通信函数调用则在通信域域MyWorldMyWorld的基础上产生了几个分割的子通信域。原通信域的基础上产生了几个分割的子通信域。原通信域MyWorldMyWorld中中的进程按照不同的的进程按照不同的ColorColor值处在不同的分割通信域中,每个进程在不同分值处在不同的分割通信域中,每个进程在不同分割通信域中的进程编号则由割通信域中的进程编

34、号则由KeyKey值来标识。值来标识。Rank in MyWorld0123456789Color0120120120Key0001112223Rank in SplitWorld(Color=0)0123Rank in SplitWorld(Color=1)012Rank in SplitWorld(Color=2)0122023/4/829国家高性能计算中心(合肥)4.3 MPI消息(通信域)组间通信域组间通信域是一种特殊的通信域,该通信域包括了两个是一种特殊的通信域,该通信域包括了两个进程组,分属于两个进程组的进程之间通过组间通信域进程组,分属于两个进程组的进程之间通过组间通信域实现通信

35、。实现通信。一般把调用进程所在的进程组称为本地进程组,而把另一般把调用进程所在的进程组称为本地进程组,而把另外一个称为远程进程组。外一个称为远程进程组。函数名函数名含含义义MPI_Comm_test_inter判断给定的通信域是否为组间通信域MPI_Comm_remote_size获取指定组间通信域中远程进程组的大小MPI_Comm_remote_group返回给定组间通信域的远程进程组MPI_Intercomm_creat根据给定的两个组内通信域生成一个组间通信域。MPI_Intercomm_merge将给定组间通信域包含的两个进程组合并,形成一个新的组内通信域2023/4/830国家高性能

36、计算中心(合肥)4.3 MPI消息(消息状态)消息状态消息状态(MPI_StatusMPI_Status类型类型)存放接收消息的状态信息,存放接收消息的状态信息,包括消息的源进程标识、消息标签、包含的数据项个数包括消息的源进程标识、消息标签、包含的数据项个数等。等。它是消息接收函数它是消息接收函数MPI_RecvMPI_Recv的最后一个参数的最后一个参数 当一个接收者从不同进程接收不同大小和不同标签的消当一个接收者从不同进程接收不同大小和不同标签的消息时,消息的状态信息非常有用。息时,消息的状态信息非常有用。2023/4/831国家高性能计算中心(合肥)4.3 MPI消息(消息状态)假设多个

37、客户进程发送消息给服务进程请求服务,通过假设多个客户进程发送消息给服务进程请求服务,通过消息标签来标识客户进程,从而服务进程采取不同的服消息标签来标识客户进程,从而服务进程采取不同的服务务 while(true)while(true)MPI_Recv(received_request,100,MPI_BYTE,MPI_Any_sourMPI_Recv(received_request,100,MPI_BYTE,MPI_Any_source,MPI_Any_tag,comm,&Status);ce,MPI_Any_tag,comm,&Status);switch(switch(Status.MP

38、I_TagStatus.MPI_Tag)case tag_0:perform service type0;case tag_0:perform service type0;case tag_1:perform service type1;case tag_1:perform service type1;case tag_2:perform service type2;case tag_2:perform service type2;2023/4/832国家高性能计算中心(合肥)4.4 点对点通信 MPIMPI的点对点通信的点对点通信(Point-to-Point Communication)(

39、Point-to-Point Communication)同同时提供了阻塞和非阻塞两种时提供了阻塞和非阻塞两种通信机制通信机制 。同时也支持多种同时也支持多种通信模式。通信模式。不同通信模式和不同通信机制的结合,便产生了非常丰不同通信模式和不同通信机制的结合,便产生了非常丰富的点对点通信函数。富的点对点通信函数。2023/4/833国家高性能计算中心(合肥)4.4 点对点通信(通信模式)通信模式通信模式通信模式通信模式(Communication Mode)(Communication Mode)指的是缓冲管理,以指的是缓冲管理,以及发送方和接收方之间的同步方式。及发送方和接收方之间的同步方式

40、。共有下面四种通信模式共有下面四种通信模式 同步同步(synchronoussynchronous)通信模式通信模式 缓冲缓冲(bufferedbuffered)通信模式通信模式 标准标准(standard)(standard)通信模式通信模式 就绪就绪(ready)(ready)通信模式通信模式2023/4/834国家高性能计算中心(合肥)4.4 点对点通信(通信模式)同步通信模式同步通信模式同步通信模式同步通信模式:只有相应的接收过程已经启动,发送过只有相应的接收过程已经启动,发送过程才正确返回。程才正确返回。因此,同步发送返回后,表示发送缓冲区中的数据已经因此,同步发送返回后,表示发送缓

41、冲区中的数据已经全部被系统缓冲区缓存,并且已经开始发送。全部被系统缓冲区缓存,并且已经开始发送。当同步发送返回后,发送缓冲区可以被释放或者重新使当同步发送返回后,发送缓冲区可以被释放或者重新使用。用。SRSynchronous1232023/4/835国家高性能计算中心(合肥)4.4 点对点通信(通信模式)缓冲通信模式缓冲通信模式缓冲通信模式缓冲通信模式:缓冲通信模式的发送不管接收操作是否缓冲通信模式的发送不管接收操作是否已经启动都可以执行。已经启动都可以执行。但是需要用户程序事先申请一块足够大的缓冲区,通过但是需要用户程序事先申请一块足够大的缓冲区,通过MPI_Buffer_attchMPI

42、_Buffer_attch实现,通过实现,通过MPI_Buffer_detachMPI_Buffer_detach来回收申请的缓冲区。来回收申请的缓冲区。SRBuffer122023/4/836国家高性能计算中心(合肥)4.4 点对点通信(通信模式)标准通信模式:标准通信模式:标准通信模式:标准通信模式:是否对发送的数据进行缓冲由是否对发送的数据进行缓冲由MPIMPI的的实现来决定,而不是由用户程序来控制。实现来决定,而不是由用户程序来控制。发送可以是同步的或缓冲的,取决于实现发送可以是同步的或缓冲的,取决于实现StandardSR12023/4/837国家高性能计算中心(合肥)4.4 点对点

43、通信(通信模式)就绪通信模式:就绪通信模式:就绪通信模式:就绪通信模式:发送操作只有在接收进程相应的接收发送操作只有在接收进程相应的接收操作已经开始才进行发送。操作已经开始才进行发送。当发送操作启动而相应的接收还没有启动,发送操作当发送操作启动而相应的接收还没有启动,发送操作将出错。就绪通信模式的特殊之处就是接收操作必须将出错。就绪通信模式的特殊之处就是接收操作必须先于发送操作启动。先于发送操作启动。SRReady122023/4/838国家高性能计算中心(合肥)4.4 点对点通信(通信模式)阻塞和非阻塞通信的主要区别在于返回后的阻塞和非阻塞通信的主要区别在于返回后的资源可用性资源可用性 阻塞

44、通信返回的条件:阻塞通信返回的条件:通信操作已经完成通信操作已经完成,及消息已经发送或接收,及消息已经发送或接收 调用的缓冲区可用调用的缓冲区可用。若是发送操作,则该缓冲区可以被其它的。若是发送操作,则该缓冲区可以被其它的操作更新;若是接收操作,该缓冲区的数据已经完整,可以被操作更新;若是接收操作,该缓冲区的数据已经完整,可以被正确引用。正确引用。2023/4/839国家高性能计算中心(合肥)4.4 点对点通信(通信模式)MPIMPI的发送操作支持四种通信模式,它们与阻塞属性一的发送操作支持四种通信模式,它们与阻塞属性一起产生了起产生了MPIMPI中的中的8 8种发送操作。种发送操作。而而MP

45、IMPI的接收操作只有两种:阻塞接收和非阻塞接收。的接收操作只有两种:阻塞接收和非阻塞接收。非阻塞通信返回后并不意味着通信操作的完成,非阻塞通信返回后并不意味着通信操作的完成,MPIMPI还还提供了对非阻塞通信完成的检测,主要的有两种:提供了对非阻塞通信完成的检测,主要的有两种:MPI_WaitMPI_Wait函数和函数和MPI_TestMPI_Test函数。函数。2023/4/840国家高性能计算中心(合肥)4.4 点对点通信(通信模式)MPIMPI的点对点通信操作的点对点通信操作MPI 原原语语阻塞阻塞非阻塞非阻塞Standard SendMPI_SendMPI_IsendSynchron

46、ous SendMPI_ SsendMPI_ IssendBuffered SendMPI_ BsendMPI_ IbsendReady SendMPI_ RsendMPI_ IrsendReceiveMPI_RecvMPI_IrecvCompletion CheckMPI_WaitMPI_Test2023/4/841国家高性能计算中心(合肥)4.4 点对点通信(通信模式)在阻塞通信的情况下,通信还没有结束的时候,处理器只能等待,在阻塞通信的情况下,通信还没有结束的时候,处理器只能等待,浪费了计算资源。浪费了计算资源。一种常见的技术就是设法使计算与通信重叠,非阻塞通信可以用一种常见的技术就是设

47、法使计算与通信重叠,非阻塞通信可以用来实现这一目的。来实现这一目的。一条三进程的流水线,一个进程连续地从左边的进程接收一个输一条三进程的流水线,一个进程连续地从左边的进程接收一个输入数据流,计算一个新的值,然后将它发送给右边的进程。入数据流,计算一个新的值,然后将它发送给右边的进程。while(while(Not_DoneNot_Done)MPI_Irevc(NextXMPI_Irevc(NextX,);,);MPI_Isend(PreviousYMPI_Isend(PreviousY,);,);CurrentYCurrentY=Q(CurrentXQ(CurrentX););2023/4/8

48、42国家高性能计算中心(合肥)4.4 点对点通信(通信模式)非阻塞通信中,双缓冲是一种常用的方法。非阻塞通信中,双缓冲是一种常用的方法。我们需要为我们需要为X X和和Y Y各自准备两个单独的缓冲,当接收进程向缓各自准备两个单独的缓冲,当接收进程向缓冲中放下一个冲中放下一个X X时,计算进程可能从另一个缓冲中读当前的时,计算进程可能从另一个缓冲中读当前的X X。我们需要确信缓冲中的数据在缓冲被更新之前使用我们需要确信缓冲中的数据在缓冲被更新之前使用 。代码如下代码如下 while(while(Not_DoneNot_Done)if(X=Xbuf0)X=Xbuf1;Y=Ybuf1;if(X=Xbu

49、f0)X=Xbuf1;Y=Ybuf1;XinXin=Xbuf0;=Xbuf0;YoutYout=Ybuf0;=Ybuf0;else X=Xbuf0;Y=Ybuf0;else X=Xbuf0;Y=Ybuf0;XinXin=Xbuf1;=Xbuf1;YoutYout=Ybuf1;=Ybuf1;MPI_Irevc(XinMPI_Irevc(Xin,recv_handlerecv_handle););MPI_Isend(YoutMPI_Isend(Yout,send_handlesend_handle););Y=Q(X);/*Y=Q(X);/*重叠计算重叠计算*/MPI_Wait(recv_handl

50、e,recv_statusMPI_Wait(recv_handle,recv_status););MPI_Wait(send_handle,send_statusMPI_Wait(send_handle,send_status););2023/4/843国家高性能计算中心(合肥)4.4 点对点通信(通信模式)send_handlesend_handle和和revc_handlerevc_handle分别用于检查发送接收是否完成。分别用于检查发送接收是否完成。检查发送接收通过调用检查发送接收通过调用MPI_Wait(HandleMPI_Wait(Handle,Status),Status)来实现

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com