3.2.4 阻塞接收 |
下面给出阻塞接收的语法。
MPI_RECV(buf,count,datatype,source,tag,comm,status)
OUT buf 接收缓存的起始地址(选择型)
IN count 接收缓存中元素的个数(整型)
IN datatype 每个接收缓存元素的数据类型(句柄)
IN source 发送操作的进程号(整型)
IN tag 消息的标识(整型)
IN comm 通信组(句柄)
OUT status 状态对象(状态)
int MPI_Recv(void* buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)
MPI_RECV(BUF, COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS, IERROR)
<type>BUF(*)
INTEGER COUNT, DATATYPE, SOURCE, TAG, COMM, STATUS(MPI_STATUS_SIZE), IERROR
这个调用的阻塞语义在3.4节描述。
接收缓存由包含count个类型为datatype的连续元素空间组成, 起始地址为buf。被接收消息的长度必须小于或等于接收缓存的长度。如果数据不适合,没有截断,接收缓存发生溢出错误。
如果一个短于接收缓存的消息到达,那么只有相应于这个消息的那些地址被修改。
给用户的建议. 在3.8节描述的MPI_PROBE函数能被用于接收不知长度的消息。(给用户的建议结束)。
给实现者的建议. 既使MPI没有为错误程序规定特别动作, 溢出情况的推鉴处理在status中返回, 有将要接收信息的source和tag。这个接收操作将返回一个错误代码。一个高质量实现也将保证接收缓存以外的存储空间不被重写。
在一个消息短于接收缓存时,MPI严格限制, 不准对其他空间修改。一个更宽厚条件的语句允许某些优化,但这个不被允许。既使是个坏地址,实现必须准备完成接收缓存到接收存储器的拷贝。(给实现者的建议结束)。
一个接收操作对消息的选择是由消息的信封值管理的。如果消息的信封与接收操作所指定的值source,tag和comm相匹配, 那么这个接收操作能接收这个消息。接收者可以给source指定一个任意值 MPI_ANY_SOURCE ,和/或给tag一个任意值MPI_ANY_TAG, 表明任何source 和/或tag 是可接收的。不能给comm指定任意值。所以, 如果一个消息被寄给接收进程, 有匹配的通信组, 有匹配的 source ( 如果source = MPI_ANY_SOURCE不成立), 有匹配的tag( 如果tag = MPI_ANY_TAG 不成立 ),那么这个消息能被这个接收操作接收。
消息的 tag 是由接收操作的 tag 参数指定的。参数 source 如果不同于MPI_ANY_SOURCE, 那么被指定为同一通信组( 远程进程组, 组间通信组 )的进程组的一个进程号。所以source参数的有效值范围是0,...,n-1 U MPI_ANY_SOURCE,n是这个进程组中进程的个数。
注意发送和接收操作间的不对称性:一个接收操作可以接收任何发送者的消息,另一方面,一个发送操作必须指明一个单独的接收者。这和“push”通信机制匹配,数据转换是受发送者影响( 而不是“pull”机制,数据转换是受接收者影响)。
Source = destination 是允许的, 即, 一个进程可以给自己发送一个消息。( 但用上述描述的阻塞发送和接收操作是不安全的, 因为这可能导致死锁。看3.5节 。)
给实现者的建议. 消息的上下文和其他通信组信息能被作为一个附加的标识域来实现。它不同于规则的消息标识,即这个域上任意匹配不允许,并且这个域值的设定是受通信组处理函数的控制。(给实现者的建议结束)。
Copyright: NPACT |