目录
一、消息组成
MPI消息组成包括两部分:信封、数据。
信封指出了发送或接收消息的对象及相关信息。数据是是本消息需要传递的内容。信封和消息分别包括三部分,可以用一个三元组来表示:
信封:<源/目的,标识,通信域>
数据:<起始地址,数据个数,数据类型>
以MPI_SEND和MPI_RECV为例,对其消息组成进行分解:
消息信封中tag存在的意义:当发送方发送两个相同类型的数据给同一个接收方时,如果没有消息标识,接收方将无法区别两个消息。
二、任意源和任意标识
接收操作对消息的选择是由消息的信封决定的,如果消息信封与接收操作所指定的值source、tag、comm相匹配,则这个接收操作可以接收这个消息。接收方可以给source指定一个任意值MPI_ANY_SOURCE,表示任何进程发送的消息都可以接收,即本接收操作可以匹配任何进程发送的消息,但是其它要求还需要满足,比如tag的匹配。如果给tag指定一个任意值MPI_ANY_TAG,表示任何tag的消息都可以接收,这种方式类似于通配符。MPI_ANY_SOURCE和MPI_ANY_TAG可以同时使用或单独使用,但不能给comm指定任意值。如果一个消息被发送到接收进程,接收进程有相匹配的通信域,有匹配的source(或source=MPI_ANY_SOURCE),有匹配的tag(或tag=MPI_ANY_TAG),那么这个消息能被这个接收方接收。
由于MPI_ANY_SOURCE和MPI_ANY_TAG的存在,使得发送操作和接收操作间存在不对称性,即一个接收操作可以接收任何发送方的消息,但是对于一个发送操作,必须指明一个单独的接收方。
MPI允许发送方=接收方,即Source=Destination,一个进程可以给自己发送消息,但是这种操作可能会产生死锁。
三、通信域
MPI通信域包括两部分:进程组、通信上下文。
进程组是所有参加通信的进程的集合,如果一共有N个进程参加通信,则进程的编号从0到N-1。通信上下文提供一个相对独立的通信区域,不同的消息在不同的上下文中进行传递,不同上下文的消息互不干涉,通信上下文可以将不同的通信区分开来。
MPI_COMM_WORLD是MPI预定义的通信域,MPI初始化后,便会产生这一个通信域,它包括了初始化时可得到的全部进程,进程是由他们在MPI_COMM_WORLD组中的进程号标识。
用户可以在原有的通信域基础上自定义新的通信域。通信域为库和通信模式提供了一种重要的封装机制。其允许各模式有自己的独立的通信域和自己的进程计数方案。
本节简单介绍了MPI通信中消息的结构和通信域,下一节将开始MPI程序的设计。