04 MPI消息

来源:互联网 发布:c语言生成随机数 编辑:程序博客网 时间:2024/06/06 01:40

一 MPI消息的组成

MPI消息包括信封和数据两个部分,信封指出了发送或接收消息的对象及相关信息,而数据是本消息将要传递的内容。信封和数据又分别包括三个部分。可以用一个三元组来表示:
信封
</目,标识,通信域>
数据 <起始地址,数据个数,数据类型>

在消息信封中除了源/目外,为什么还有tag标识呢?这是因为,当发送者发送两个相同类型的数据给同一个接收者时,如果没有消息标识,接收者将无法区别这两个消息。 


二 任意源和任意标识

一个接收操作对消息的选择是由消息的信封管理的。如果消息的信封与接收操作所指定的值source,tagcomm相匹配,那么这个接收操作能接收这个消息。接收者可以给source指定一个任意值MPI_ANY_SOURCE,标识任何进程发送的消息都可以接收,即本接收操作可以匹配任何进程发送的消息,但其它的要求还必须满足,比如tag的匹配;如果给tag一个任意值MPI_ANY_TAG,则任何tag都是可接收的,在某种程度上,类似于统配符的概念。MPI_ANY_SOURCEMPI_ANY_TAG可以同时使用或分别单独使用,但是不能给comm指定任意值,如果一个消息被发送到接收进程,接收进程有匹配的通信域,有匹配的source (或其source = MPI_ANY_SOURCE),有匹配的tag(或其tag = MPI_ANY_TAG) 那么这个消息能被这个接收操作接收。
由于
MPI_ANY_SOURCEMPI_ANY_TAG的存在,导致了发送操作和接收操作间的不对称性,即一个接收操作可以接收任何发送者的消息 但是对于一个发送操作,则必须指明一个单独的接收者。
MPI允许发送者=接收者Source = destination 即一个进程可以给自己发送一个消息。但是这种操作要注意死锁的产生。


三 MPI通信域

MPI通信域包括两部分:进程组和通信上下文。进程组即所有参加通信的进程的集合,如果一共有N个进程参加通信,则进程的编号从0N-1;通信上下文提供一个相对独立的通信区域,不同的消息在不同的上下文中进行传递,不同上下文的消息互不干涉,通信上下文可以将不同的通信区别开来。
一个预定义的通信域
MPI_COMM_WORLDMPI提供。MPI初始化后,便会产生这一描述子,它包括了初始化时可得的全部进程,进程是由它们在MPI_COMM_WORLD组中的进程号所标识。
用户可以在原有的通信域的基础上,定义新的通信域。通信域为库和通信模式提供一种重要的封装机制,他们允许各模式有其自己的独立的通信域,和它们自己的进程计数方案。