MPI消息的组成 MPI消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。信封和数据又分别包括三个部分。可以用一个三元组来表示。
信封:<源/目,标识,通信域> 数据:<起始地址,数据个数,数据类型> 讲解:
以MPI_SEND和MPI_RECV为例,下图分别给出了它们的信封和数据部分。
图6-2 MPI_SEND 语句的消息信封和消息数据
 |
图6-3 MPI_RECV语句的消息信封和消息数据
 |
在消息信封中除了源/目外,为什么还有tag标识呢?这是因为,当发送者发送两个相同类型的数据给同一个接收者时,如果没有消息标识,接收者将无法区别这两个消息。
任意源和任意标识
MPI_ANY_SOURCE,MPI_ANY_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通信域包括两部分:进程组和通信上下文。进程组即所有参加通信的进程的集合,如果一共有N个进程参加通信,则进程的编号从0到N-1;通信上下文提供一个相对独立的通信区域,不同的消息在不同的上下文中进行传递,不同上下文的消息互不干涉,通信上下文可以将不同的通信区别开来。
讲解 一个预定义的通信域MPI_COMM_WORLD由MPI提供。MPI初始化后,便会产生这一描述子,它包括了初始化时可得的全部进程,进程是由它们在MPI_COMM_WORLD组中的进程号所标识。
用户可以在原有的通信域的基础上,定义新的通信域。通信域为库和通信模式提供一种重要的封装机制。他们允许各模式有其自己的独立的通信域,和它们自己的进程计数方案。
|