3.2.4 阻塞接收 BACKWARDFORWARD


下面给出阻塞接收的语法。

MPI_RECV(buf,count,datatype,source,tag,comm,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)

这个调用的阻塞语义在3.4节描述。   

接收缓存由包含count个类型为datatype的连续元素空间组成, 起始地址为buf。被接收消息的长度必须小于或等于接收缓存的长度。如果数据不适合,没有截断,接收缓存发生溢出错误。   

如果一个短于接收缓存的消息到达,那么只有相应于这个消息的那些地址被修改。   

一个接收操作对消息的选择是由消息的信封值管理的。如果消息的信封与接收操作所指定的值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
BACKWARDFORWARD