《分布存储系统并行编程ppt课件.ppt》由会员分享,可在线阅读,更多相关《分布存储系统并行编程ppt课件.ppt(126页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十四章 分布存储系统并行编程国家高性能计算中心(合肥)分布存储系统并行编程 14.1 14.1 基于消息传递的编程基于消息传递的编程 14.2 MPI14.2 MPI并行编程并行编程 14.3 PVM14.3 PVM并行编程并行编程 14.4 14.4 基于数据并行的并行编程基于数据并行的并行编程 14.5 HPF14.5 HPF并行编程并行编程国家高性能计算中心(合肥)基于消息传递的并行编程基于消息传递的并行编程1消息传递库消息传递库2消息传递方式消息传递方式国家高性能计算中心(合肥)1消息传递库消息传递库(Message-PassingLibraries)建议建议:一个终端用户在开发新的
2、消息传递应用时使用一个终端用户在开发新的消息传递应用时使用MPIMPI或或PVM.PVM.原因是原因是:MPI MPI和和PVMPVM都是都是公用软件公用软件,易于得到易于得到 多数厂家支持多数厂家支持国家高性能计算中心(合肥)CMMD:是一个用于ThinkingMachinesCM-5系统的消息传递库,其特点是基于主动消息(ActiveMessage)机制在用户空间实现通信以减少通信延迟;Express:是一个支持点到点和群集通信以及并行I/O的程序设计环境;Nx:是为IntelMPP(例如,Hypercubes和Paragon)开发的微核系统.现在已由用于Intel/SandiaASCIT
3、FLOPS系统中的新的微核系统PUMA代替.Fortran-M:是对Fortran77的扩展,它在设计上既支持共享存储也支持消息传递,但当前只实现了对消息传递的支持.该语言提供了许多机制用于支持开发行为确定、模块化的并行程序.P4(ParallelProgramsforParallelProcessors):是一组宏和子程序,用于支持共享存储和消息传递系统中的程序设计,它可以移植到许多体系结构上.其它的消息传递软件系统还有Vertex,PARMACS,Zipcode,UNIFY和PICL等.1消息传递库消息传递库(Message-PassingLibraries)国家高性能计算中心(合肥)在当
4、前所有的消息传递软件中在当前所有的消息传递软件中,最重要最流行的是最重要最流行的是MPIMPI和和PVM,PVM,它们能运行在所有的并行平台上它们能运行在所有的并行平台上,包括包括SMPSMP和和PVP.PVP.二者二者已经在已经在WindowsNT和和Windows95这样的非这样的非Unix平平台上实现台上实现.程序设计语言支持程序设计语言支持C,Fortran和和Java.在国产的三大并行机系列神威、银河和曙光上都实现了在国产的三大并行机系列神威、银河和曙光上都实现了对对MPIMPI和和PVMPVM和支持和支持.1消息传递库消息传递库(Message-PassingLibraries)国
5、家高性能计算中心(合肥)1.1 MPI1.1 MPI(MessagePassingInterface)简介简介1消息传递库消息传递库(Message-PassingLibraries)目标目标:是提供一个实际可用的、可移植的、高效的和灵活的是提供一个实际可用的、可移植的、高效的和灵活的消息传递接口标准消息传递接口标准.MPI.MPI以语言独立的形式来定义这个接口库以语言独立的形式来定义这个接口库,并提供了与并提供了与C C、FortranFortran和和JavaJava语言的绑定语言的绑定.这个定义不包含这个定义不包含任何专用于某个特别的制造商、操作系统或硬件的特性任何专用于某个特别的制造商
6、、操作系统或硬件的特性.由由于这个原因于这个原因,MPI,MPI在并行计算界被广泛地接受在并行计算界被广泛地接受.国家高性能计算中心(合肥)MPI的实现的实现建立在厂家专用的环境之上建立在厂家专用的环境之上IBMSP2的的POE/MPL,IntelParagon的的OSF/Nx公共的公共的MPI环境环境:CHIMPEdinburg大学大学LAN(LocalAreaMulticomputer)Ohio超级计算中心超级计算中心MPICHArgonne国家实验室与国家实验室与Mississippi州立大学州立大学MPICH是是MPI在各种机器上的可移植实现在各种机器上的可移植实现,可以安装在几乎所有
7、的平台上可以安装在几乎所有的平台上:PC工作站工作站SMPMPPCOW1消息传递库消息传递库(Message-PassingLibraries)国家高性能计算中心(合肥)1.2PVM(ParallelVirtualMachine)简介简介开发时间开发时间:始于始于1989年年开发单位开发单位:美国美国Tennessee大学、大学、OakRidge国家实验室和国家实验室和Emory大学联合研制大学联合研制特点特点:具有较好的适应性、可扩展性、可移植性和易使用性等具有较好的适应性、可扩展性、可移植性和易使用性等特点特点,源代码可以免费获取源代码可以免费获取,现已被用户广泛采纳现已被用户广泛采纳.现
8、状现状:目前对它的研究和开发工作仍在各大学和研究机构进行目前对它的研究和开发工作仍在各大学和研究机构进行.尽管已经有越来越多的人开始使用尽管已经有越来越多的人开始使用MPI,但但PVM仍然是做并行仍然是做并行处理最流行的软件之一处理最流行的软件之一.随着它的不断流行随着它的不断流行,已经被移植到已经被移植到PVP,SMP,MPP,工作站和工作站和PC组成的机群系统组成的机群系统.1消息传递库消息传递库(Message-PassingLibraries)国家高性能计算中心(合肥)PVMPVM和和MPIMPI间的主要差别间的主要差别:(1)PVM(1)PVM是一个自包含的系统是一个自包含的系统,而
9、而MPIMPI不是不是.MPI.MPI依赖于支持依赖于支持它的平台提供对进程的管理和它的平台提供对进程的管理和I/OI/O功能功能.而而PVMPVM本身就包含本身就包含这些功能这些功能.(2)MPI(2)MPI对消息传递提供了更强大的支持对消息传递提供了更强大的支持.(3)PVM(3)PVM不是一个标准不是一个标准,这就意味着这就意味着PVMPVM可以更方便、更频可以更方便、更频繁地进行版本更新繁地进行版本更新.MPIMPI和和PVMPVM在功能上现在正趋于相互包含在功能上现在正趋于相互包含.例如例如,MPI-2,MPI-2增增加了进程管理功能加了进程管理功能,而现在的而现在的PVMPVM也提
10、供了更多的群集通也提供了更多的群集通信函数信函数.与与MPIMPI不同的是不同的是,1消息传递库消息传递库(Message-PassingLibraries)国家高性能计算中心(合肥)1.2Message-PassingModes关于通信模式关于通信模式,用户需要理解的有三个方面用户需要理解的有三个方面:共有多少个进程共有多少个进程?进程间如何同步进程间如何同步?如何管理通信缓冲区如何管理通信缓冲区?现在的消息传递系统多使用三种通信模式现在的消息传递系统多使用三种通信模式:同步的消息传递同步的消息传递(SynchronousMessagePassing)阻塞的消息传递阻塞的消息传递(Block
11、ingMessagePassing)非阻塞的消息传递非阻塞的消息传递(NonblockingMessagePassing)2消息传递方式消息传递方式国家高性能计算中心(合肥)发送例程接收例程进程Q接收返回点开始接收点R_syn1S_Block2S_Non_Block3进程P开始发送点发送返回点S_syn1R_block2R_Non_Block3系统进程等待发送点2消息传递方式消息传递方式国家高性能计算中心(合肥)ProcessP:M=10;L1:sendMtoQ;L2:M=20;gotoL1;ProcessQ:L1:S=-100;L2:receiveSfromP;X=S+1;例例2.1 2.1
12、 消息传递中的发送和接收缓冲消息传递中的发送和接收缓冲M称为发送消息缓冲称为发送消息缓冲(sendmessagebuffer,orsendbuffer)S称为接收消息缓冲称为接收消息缓冲(receivemessagebuffer,orreceivebuffer)2消息传递方式消息传递方式国家高性能计算中心(合肥)三种通信模式的比较2消息传递方式消息传递方式国家高性能计算中心(合肥)ProcessP:M=10;sendMtoQ;do some computation which does not change M;waitforMtobesent;M=20;ProcessQ:S=-100;rec
13、eiveSfromP;do some computation which does not use S;waitforStobereceived;X=S+1;例例2.22.2 非阻塞模式下非阻塞模式下,强制进程等待直到安全时再继续执行强制进程等待直到安全时再继续执行非阻塞模式本身也会带来一些额外开销非阻塞模式本身也会带来一些额外开销:作为临时缓冲区用的内存空间作为临时缓冲区用的内存空间 分配缓冲区的操作分配缓冲区的操作 将消息拷入和拷出临时缓冲区将消息拷入和拷出临时缓冲区 执行一个额外的检测和等待函数执行一个额外的检测和等待函数2消息传递方式消息传递方式国家高性能计算中心(合肥)消息传递的特点
14、消息传递的特点:在消息传递模型中在消息传递模型中,一个并行应用由一组进程组成一个并行应用由一组进程组成,每个进程的代码是本每个进程的代码是本地的地的,只能访问私有数据只能访问私有数据,进程之间通过传递消息实现数据共享和进进程之间通过传递消息实现数据共享和进程同步程同步.优点优点:用户可以对并行性的开发、数据分布和通信实现完全控制用户可以对并行性的开发、数据分布和通信实现完全控制.缺点缺点:(1)(1)要求程序员显式地处理通信问题要求程序员显式地处理通信问题,如如,消息传递调用的位置消息传递调用的位置,数据移数据移动动,数据复制数据复制,数据操作数据操作,数据的一致性等等数据的一致性等等.(2)
15、(2)对大多数科学计算程序来说对大多数科学计算程序来说,消息传递模型的真正困难还在于显式的消息传递模型的真正困难还在于显式的域分解域分解,也就是说也就是说,将对相应数据的操作限定在指定的处理器上进行将对相应数据的操作限定在指定的处理器上进行,在每个处理器上只能看见整个分布数据的一部分在每个处理器上只能看见整个分布数据的一部分.(3)(3)无法以渐进的方式、通过逐步将串行代码转换成并行代码而开发出来无法以渐进的方式、通过逐步将串行代码转换成并行代码而开发出来.大量的散布在程序各处的域分解要求整个程序由串行到并行的转换一大量的散布在程序各处的域分解要求整个程序由串行到并行的转换一次性实现次性实现,
16、而共享存储方法允许在现有的串行代码中插入并行说明从而共享存储方法允许在现有的串行代码中插入并行说明从而实现逐步转换而实现逐步转换.与之相比与之相比,这是消息传递的一个明显的缺点这是消息传递的一个明显的缺点.2消息传递方式消息传递方式国家高性能计算中心(合肥)分布存储系统并行编程 14.1 14.1 基于消息传递的编程基于消息传递的编程 14.2 MPI14.2 MPI并行编程并行编程 14.3 PVM14.3 PVM并行编程并行编程 14.4 14.4 基于数据并行的并行编程基于数据并行的并行编程 14.5 HPF14.5 HPF并行编程并行编程国家高性能计算中心(合肥)MPI并行编程1MPI
17、中的消息中的消息2MPI中的消息信封中的消息信封3MPI中的四种通信模式中的四种通信模式4点对点的通信点对点的通信5群集通信群集通信6MPI扩展扩展7例子例子:计算计算Pi的的MPI程序程序国家高性能计算中心(合肥)1MPI中的消息中的消息第五讲#includempi.hintfoo(i)inti;.main(argc,argv)intargc;char*argvinti,tmp,sum=0,group_size,my_rank,N;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD,&group_size);MPI_Comm_rank(MPI
18、_COMM_WORLD,&my_rank);if(my_rank=0)printf(EnterN:);scanf(%d,&N);for(i=1;igroup_size;i+)MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD);for(i=my_rank;iN;i=i+group_size)sum=sum+tmp;for(i=1;igroup_size;i+)MPI_Recv(&tmp,1,MPI_INT,i,i,MPI_COMM_WORLD,&status);sum=sum+tmp;printf(nTheresult=%d,sum);elseMPI_Recv(&
19、N,1,MPI_INT,i,i,MPI_COMM_WORLD,&status);for(i-my_rank;iN;i=i+group_size)sum=sum+foo(i);MPI_Send(&sum,1,MPI_INT,0,i,MPI_COMM_WORLD);MPI_Finalize();例例1.1一个计算一个计算foo(i)的的MPISPMD消消息传递程序息传递程序,存放在文件存放在文件“myprog.c”中中初始化初始化MPI环境环境得到缺省的进程组大小得到缺省的进程组大小得到每个进程在组得到每个进程在组中的编号中的编号发送消息发送消息接收消息接收消息终止终止MPIMPI环境环境国家高性
20、能计算中心(合肥)这个程序用以下并行C编译器mpcc来编译:执行下列命令将可执行程序myprog加载到n个节点上:yprogMPIRUNmyprognpnMPI进程是重型的单线进程.它们拥有不同的地址空间.因此,一个进程不能直接访问另一个进程地址空间的中的变量.进程间的通信用消息传递来实现.1MPI中的消息中的消息国家高性能计算中心(合肥)为什么为什么MPI中的发送和接收操作要做得这么复杂呢中的发送和接收操作要做得这么复杂呢?MPI消息的组成消息的组成:消息的内容消息的内容(即即,信的内容信的内容),称为消息缓冲称为消息缓冲(messagebuffer)消息的接收者消息的接收者(即即,写在信封
21、上面的东西写在信封上面的东西),称为消息信封称为消息信封(messageenvelop)MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD)MPI_Recv(&N,1,MPI_INT,0,i,MPI_COMM_WORLD,&status)sendMtoQ;receiveSfromP1MPI中的消息中的消息国家高性能计算中心(合肥)考虑一个用考虑一个用C语言声明的由语言声明的由N个复数组成的数组个复数组成的数组doubleA100假定进程假定进程P要把这个数组发送给进程要把这个数组发送给进程Q:例例1用用MPI发送一个数据数组发送一个数据数组1MPI中的消息中的消息
22、国家高性能计算中心(合肥)1MPI中的消息中的消息国家高性能计算中心(合肥)MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD)子程序名消息地址消息长度消息数据类型接收进程标识号消息标签通信子MPI_Send(buffer,count,datatype,destination,tag,communicator)(buffer,count,datatype)消息缓冲消息缓冲(destination,tag,communicator)消息信封消息信封1MPI中的消息中的消息国家高性能计算中心(合肥)消息数据类型消息数据类型(messagedatatypes)通信子通信
23、子(communicators)通信操作通信操作(communicationoperations)虚拟拓扑虚拟拓扑(virtualtopology)MPI的的四个重要概念四个重要概念:1MPI中的消息中的消息国家高性能计算中心(合肥)理由有两个理由有两个:一是支持异构计算一是支持异构计算 另一是允许非连续另一是允许非连续,非均匀内存区中的消息非均匀内存区中的消息.异构计算异构计算(heterogeneouscomputing):指的是在由不同计算机指的是在由不同计算机,如工作站网络如工作站网络,组成的系统上运行应用程序组成的系统上运行应用程序.系统中的每台计算系统中的每台计算机可能由不同的厂商
24、生产、使用不同的处理器和操作系统机可能由不同的厂商生产、使用不同的处理器和操作系统当这些计算机使用不同的数据表示时如何保证互操作性当这些计算机使用不同的数据表示时如何保证互操作性.为什么需要定义消息数据类型为什么需要定义消息数据类型?1MPI中的消息中的消息国家高性能计算中心(合肥)1MPI中的消息中的消息国家高性能计算中心(合肥)例例2发送非连续数据项发送非连续数据项doubleA100;MPI_Pack_size(50,MPI_DOUBLE,comm,&BufferSize);TempBuffer=malloc(BufferSize);j=sizeof(MPI_DOUBLE);Positi
25、on=0;for(i=0;i50;i+)MPI_Pack(A+i*j,1,MPI_DOUBLE,TempBuffer,BufferSize,&Position,comm);MPI_Send(TempBuffer,Position,MPI_PACKED,destination,tag,comm);国家高性能计算中心(合肥)在下面的消息中在下面的消息中,假定每个双精度数有假定每个双精度数有8 8字节长字节长,一个字符是一个字符是1 1字节字节,一个一个整型数是整型数是4 4字节字节.例例3在消息传递中发送一个混合数据类型在消息传递中发送一个混合数据类型国家高性能计算中心(合肥)例例4发送一数组的发
26、送一数组的所有偶序数元素所有偶序数元素doubleA100;MPI_Data_typeEvenElements;.MPI_Type_vector(50,1,2,MPI_DOUBLE,&EvenElements);MPI_Type_commit(&EvenElements);MPI_Send(A,1,EvenElements,destination,.);国家高性能计算中心(合肥)说明说明:MPI_Type_vector(count,blocklength,stride,oldtype,&newtype)是构造导出数据类型的MPI例程.导出类型newtype由blocks的拷贝count份组成.
27、每块(blocks)由已有的数据类型oldtype的blocklength份连续项的拷贝组成.stride定义每两个连续的块之间的oldtype元素个数.因此,(stride-blocklength)即是两个块之间的间隔.1MPI中的消息中的消息国家高性能计算中心(合肥)消息缓冲消息缓冲(messagebuffer,简称简称buffer),在不同的消息传递使用场合有不同在不同的消息传递使用场合有不同的含义的含义.下面给出一些例子下面给出一些例子:消息缓冲指的是由程序员定义的应用程序的存储区域消息缓冲指的是由程序员定义的应用程序的存储区域,用于存放消用于存放消息的数据值息的数据值.例如例如,在在
28、Send(A,16,Q,tag)中中,缓冲缓冲A是在用户应用程序中声明的变量是在用户应用程序中声明的变量.该缓冲的起始地址在消息例程中被使用该缓冲的起始地址在消息例程中被使用.消息缓冲也可以指由消息传递系统消息缓冲也可以指由消息传递系统(而非用户而非用户)创建和管理的一些内创建和管理的一些内存区存区,它用于发送消息时暂存消息它用于发送消息时暂存消息.这种缓冲不在用户的应用程序中出这种缓冲不在用户的应用程序中出现现,有时被称为系统消息缓冲有时被称为系统消息缓冲(或系统缓冲或系统缓冲).MPI允许第三种可能的定义允许第三种可能的定义.用户可以划出一定大小的内存区用户可以划出一定大小的内存区,作为作
29、为出现在其应用中的任意消息的中间缓冲出现在其应用中的任意消息的中间缓冲.消息缓冲消息缓冲1MPI中的消息中的消息国家高性能计算中心(合肥)考虑下列代码考虑下列代码,由进程由进程P传送一个存放在数组传送一个存放在数组A中的消息中的消息M,到到进程进程Q的数组的数组B中中.例5在一对进程间发送消息1MPI中的消息中的消息国家高性能计算中心(合肥)ProcessPAMProcessQBProcessPAMProcessQBSProcessPAMProcessQBT(a)只使用用户缓冲(b)使用系统缓冲S(c)使用了用户级的临时缓冲TProcessP:doubleA2000000;send(A,32,
30、Q,tag);ProcessQ:doubleB32;recv(B,32,P,tag)国家高性能计算中心(合肥)用户如何来定义消息的接收者呢?在下面列出的MPI发送例程中,消息信封由三项组成.MPI_Send(address,count,datatype,destination,tag,communicator)destination域是一个整数,标识消息的接收进程.消息标签(messagetag),也称为消息类型(messagetype),是程序员用于标识不同类型消息、限制消息接收者的一个整数.2MPI中的消息信封中的消息信封国家高性能计算中心(合肥)为什么要使用消息标签为什么要使用消息标签(
31、Tag)?未使用标签使用了标签为了说明为什么要用标签为了说明为什么要用标签,我们我们先来看右面一段没有使用标签先来看右面一段没有使用标签的代码的代码:这这段段代代码码打打算算传传送送A的的前前32个个字字节节进进入入X,传传送送B的的前前16个个字字节节进进入入Y.但但是是,如如果果消消息息B尽尽管管后后发发送送但但先先到到达达进进程程Q,就就会会被被第第 一一 个个recv()接接 收收 在在X 中中.使用标签可以避免这个错误使用标签可以避免这个错误.2MPI中的消息信封中的消息信封国家高性能计算中心(合肥)使用标签的另一个原因使用标签的另一个原因是可以简化对下列情形是可以简化对下列情形的处
32、理的处理.假定有两个客户进程假定有两个客户进程P和和R,每个发送一个服务每个发送一个服务请求消息给服务进程请求消息给服务进程Q.例例6在消息传递中使用标签在消息传递中使用标签未使用标签未使用标签使用了标签使用了标签国家高性能计算中心(合肥)通信子通信子(communicator):一个进程组一个进程组(processgroup)+上下文上下文(context).进程组进程组:是进程的有限有序集是进程的有限有序集.有限意味着有限意味着,在一个进程组中在一个进程组中,进程的个数进程的个数n是有限的是有限的,这里的这里的n称为进程组的大小称为进程组的大小(groupsize).有序意味着有序意味着n
33、个进程是按整数个进程是按整数0,1,.,n-1进行编号的进行编号的.一个进程在一个通信子一个进程在一个通信子(组组)中用它的编号进行标识中用它的编号进行标识.组的组的大小和进程编号可以通过调用以下的大小和进程编号可以通过调用以下的MPI例程获得例程获得:MPI_Comm_size(communicator,&group_size)MPI_Comm_rank(communicator,&my_rank)什么是通信子什么是通信子?2MPI中的消息信封中的消息信封MPI_Send(address,count,datatype,destination,tag,communicator)国家高性能计算中
34、心(合肥)例7通信子的使用2MPI中的消息信封中的消息信封Process0:MPI_Send(msg1,count1,MPI_INT,1,tag1,comm1);parallel_fft(.);Process1:MPI_Recv(msg1,count1,MPI_INT,0,tag1,comm1);parallel_fft(.);if(my_rank=0)MPI_Send(msg2,count1,MPI_INT,1,tag2,comm2);含代码含代码含代码含代码国家高性能计算中心(合肥)存在问题存在问题:不可能保证不可能保证tag1和和tag2一定取了不同的值一定取了不同的值:标签是由用户定义
35、的整数值标签是由用户定义的整数值,用户可能会出错用户可能会出错.即使用户不会弄错即使用户不会弄错,也难以或不可能保证也难以或不可能保证tag1和和tag2有不同有不同的值的值.函数函数parallel_fft()可能是由其它用户写的可能是由其它用户写的,或者它是一或者它是一个库例程个库例程.这样这样,用户可能不知道用户可能不知道tag2的值的值.即使用户总能知道即使用户总能知道tag2的值的值,仍然可能出错仍然可能出错.因为因为MPI_Recv例程可能决定使用一个通配的例程可能决定使用一个通配的(wildcard)标签标签MPI_Any_tag.解决办法解决办法:在在parallel_fft(
36、)中的通信使用不同的通信子中的通信使用不同的通信子,它可能它可能包含相同的进程组包含相同的进程组(如如,进程进程0和和1),但每个通信子有系统指定的但每个通信子有系统指定的不同的上下文不同的上下文,与与comm1的不同的不同.因此因此,MPI_Recv不再有偶然不再有偶然会从会从parallel_fft()的的MPI_Send中接收中接收msg2的危险了的危险了.2MPI中的消息信封中的消息信封国家高性能计算中心(合肥)考虑如下由考虑如下由10个进程执行的代码个进程执行的代码:例例8MPI中的新通信子中的新通信子2MPI中的消息信封中的消息信封MPI_CommMyWorld,SplitWorl
37、d;intmy_rank,group_size,Color,Key;MPI_Init(&argc,&argv);MPI_Comm_dup(MPI_COMM_WORLD,&MyWorld);MPI_Comm_rank(MyWorld,&my_rank);MPI_Comm_size(MyWorld,&group_size);Color=my_rank%3;Key=my_rank/3;MPI_Comm_split(MyWorld,Color,Key,&SplitWorld);国家高性能计算中心(合肥)MPI_Comm_dup(MPI_COMM_WORLD,&MyWorld)将创建一个新的通信子将创建
38、一个新的通信子MyWorld,它是包含与原始它是包含与原始的的MPI_COMM_WORLD相同的相同的10个进程的进程组个进程的进程组,但但有不同的上下文有不同的上下文.2MPI中的消息信封中的消息信封国家高性能计算中心(合肥)MPI-1被设计成使不同通信子中的通信是相互分开被设计成使不同通信子中的通信是相互分开的的,以及任何群集通信是与任何点对点通信分开的以及任何群集通信是与任何点对点通信分开的,即使即使它们是在相同的通信子内它们是在相同的通信子内.通信子概念尤其方便了并行库通信子概念尤其方便了并行库的开发的开发.MPI-1只支持组内通信只支持组内通信(intra-communication
39、)MPI-2支持组间通信支持组间通信(inter-communication)2MPI中的消息信封中的消息信封国家高性能计算中心(合肥)MPI消息特性的总结消息特性的总结发送者进程总结如下发送者进程总结如下例子例子:MPI_Send(&N,1,MPI_INT,i,i,MPI_COMM_WORLD);第一个参数指明消息缓存的起始地址第一个参数指明消息缓存的起始地址,即存放要发送的数据信即存放要发送的数据信息息.第二个参数指明消息中给定的数据类型有多少项第二个参数指明消息中给定的数据类型有多少项,这个数据类这个数据类型由第三个参数给定型由第三个参数给定.数据类型要么是基本数据类型数据类型要么是基本
40、数据类型,要么是导出数据类型要么是导出数据类型,后者由后者由用户生成指定一个可能是由混合数据类型组成的非连续数据项用户生成指定一个可能是由混合数据类型组成的非连续数据项.第四个参数是目的进程的标识符第四个参数是目的进程的标识符(进程编号进程编号)第五个是消息标签第五个是消息标签第六个参数标识进程组和上下文第六个参数标识进程组和上下文,即即,通信子通信子.通常通常,消息只在消息只在同组的进程间传送同组的进程间传送.但是但是,MPI允许通过允许通过intercommunicators在在组间通信组间通信.MPI_Send(buffer,count,datatype,destination,tag,
41、communicator)国家高性能计算中心(合肥)发送者进程总结如下发送者进程总结如下例例:MPI_Recv(&tmp,1,MPI_INT,i,i,MPI_COMM_WORLD,&Status)第一个参数指明接收消息缓冲的起始地址第一个参数指明接收消息缓冲的起始地址,即存放接收消息的内存地址即存放接收消息的内存地址第二个参数指明给定数据类型的最大项数第二个参数指明给定数据类型的最大项数,它存放在第三个参数内它存放在第三个参数内,可以被可以被接收接收.接收到的实际项数可能少一些接收到的实际项数可能少一些第四个参数是源进程标识符第四个参数是源进程标识符(编号编号)第五个是消息标签第五个是消息标签
42、第六个参数标识一个通信子第六个参数标识一个通信子第七个参数是一个指针第七个参数是一个指针,指向一个结构指向一个结构MPI_StatusStatus存放了各种有关接收消息的各种信息存放了各种有关接收消息的各种信息.Status.MPI_SOURCE实际的源进程编号实际的源进程编号Status.MPI_TAG实际的消息标签实际的消息标签实际接收到的数据项数由实际接收到的数据项数由MPI例程例程MPI_Get_count(&Status,MPI_INT,&C)读出读出.这个例程使用这个例程使用Status中的信息来决定给定数据类型中的信息来决定给定数据类型(在这里是在这里是MPI_INT)中的实际项
43、数中的实际项数,将这个数放在变量将这个数放在变量C中中.这两个域可以是这两个域可以是wildcardMPI_Any_source和和MPI_Any_tag.MPI_Recv(address,count,datatype,source,tag,communicator,status)国家高性能计算中心(合肥)当一个接收者能从不同进程接收不同大小和标签的信息当一个接收者能从不同进程接收不同大小和标签的信息时时,状态信息就很有用状态信息就很有用.例例9 9 消息传递中的状态消息传递中的状态(Status)(Status)字字2MPI中的消息信封中的消息信封while(true)MPI_Recv(re
44、ceived_request,100,MPI_BYTE,MPI_Any_source,MPI_Any_tag,comm,&Status);switch(Status.MPI_Tag)casetag_0:performservicetype0;casetag_1:performservicetype1;casetag_2:performservicetype2;国家高性能计算中心(合肥)用在用在MPI中的通信模式中的通信模式(communicationmode)同步的同步的(synchronous)直到相应的接收已经启动发送才返回直到相应的接收已经启动发送才返回,因此接收端要有存因此接收端要有存
45、放到达消息的应用缓冲放到达消息的应用缓冲.注意注意:在在MPI中可以有非阻塞的同步发送中可以有非阻塞的同步发送,它的返回不意味着它的返回不意味着消息已经被发出消息已经被发出!它的实现不需要在接收端有附加的缓冲它的实现不需要在接收端有附加的缓冲,但但需要在发送端有一个系统缓冲需要在发送端有一个系统缓冲.为了消除额外的消息拷贝为了消除额外的消息拷贝,应应使用阻塞的同步发送使用阻塞的同步发送.3MPI中的四种通信模式中的四种通信模式SRSynchronous123国家高性能计算中心(合肥)缓冲的缓冲的(buffered)缓冲的发送假定能得到一定大小的缓冲空间缓冲的发送假定能得到一定大小的缓冲空间,它
46、必须事它必须事先由用户程序通过调用子例程先由用户程序通过调用子例程MPI_Buffer_attch(buffer,size)来定义来定义,由它来分配大小为由它来分配大小为size的用户缓冲的用户缓冲.这个缓冲可以用这个缓冲可以用MPI_Buffer_detach(*buffer,*size)来实现来实现.SRBuffer123MPI中的四种通信模式中的四种通信模式国家高性能计算中心(合肥)StandardSR1SRReady12标准的标准的(standard)发送可以是同步的或缓冲的发送可以是同步的或缓冲的,取决于实现取决于实现.就绪的就绪的(ready)在肯定相应的接收已经开始才进行发送在肯
47、定相应的接收已经开始才进行发送.它不像在同步模它不像在同步模式中那样需要等待式中那样需要等待.这就允许在相同的情况下实际使用一这就允许在相同的情况下实际使用一个更有效的通信协议个更有效的通信协议.3MPI中的四种通信模式中的四种通信模式国家高性能计算中心(合肥)4点对点的通信点对点的通信国家高性能计算中心(合肥)例例10使用消息传递的进程流水线使用消息传递的进程流水线X=P(W)WY=Q(X)XZ=R(Y)YZ进程流水线中的数据流进程流水线中的数据流图中是一条三进程的流水线图中是一条三进程的流水线,一个进程连续地从左边接收一个一个进程连续地从左边接收一个输入数据流输入数据流,计算一个新的值计算
48、一个新的值,将它发送给右边将它发送给右边.下面的代码下面的代码示出了基本思想示出了基本思想.进程进程Q的一段代码的一段代码while(Not_Done)MPI_Irevc(NextX,.);MPI_Isend(PreviousY,.);CurrentY=Q(CurrentX);4点对点的通信点对点的通信国家高性能计算中心(合肥)进程进程Q的代码的代码while(Not_Done)if(X=Xbuf0)X=Xbuf1;Y=Ybuf1;Xin=Xbuf0;Yout=Ybuf0;elseX=Xbuf0;Y=Ybuf0;Xin=Xbuf1;Yout=Ybuf1;MPI_Irevc(Xin,.,recv
49、_handle);MPI_Isend(Yout,.,send_handle);Y=Q(X);/*重迭计算重迭计算*/MPI_Wait(recv_handle,recv_status);MPI_Wait(send_handle,send_status);Xbuf0ReceiveXY=Q(X)YBuf0SendYXbuf1Ybuf1进程流水线中的双缓冲进程流水线中的双缓冲4点对点的通信点对点的通信国家高性能计算中心(合肥)例例11发送和接收中的死锁发送和接收中的死锁这是一段错误代码这是一段错误代码,可能会有下列结果可能会有下列结果:死锁死锁.例程例程MPI_Issend是非阻塞的、同步的发送是非阻
50、塞的、同步的发送.它直到相应的它直到相应的MPI_Irecv已经已经启动执行才返回启动执行才返回,如果条件如果条件Y=5不为真不为真,则则MPI_Irecv就就不会被执行不会被执行.Y为为0.假定当假定当if语句被执行后语句被执行后Y=5为真为真.则则MPI_Irecv会从进程会从进程P接收接收X的值的值(为为0)到它的变量到它的变量Y,并打印它并打印它.Y为为5.另一个可能的情况是当另一个可能的情况是当Y=5为真时为真时,打印会在接收到打印会在接收到X的值并存的值并存入入Y之前执行之前执行(因为因为MPI_Irecv是非阻塞的接收是非阻塞的接收).因此打印出的是因此打印出的是Y的旧值的旧值.