消息接收

  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的基本接收函数。MPI_RECV从指定的通信域comm中进程号为source的进程接收count个数据类型为datatype的数据,接收的数据被存放在接收缓冲区buf中,所接收的消息的消息标志必须为tag。 status 用来向调用者返回本次接收操作的状态。

  需要注意的是,调用者在调用这个函数以前,需要事先为接收缓冲区分配空间,buf是这个缓冲区的首地址。需要注意的是,接收缓冲区的大小必须足以容纳接收到的消息,否则MPI会发生缓冲区溢出,从而出错。在MPI函数向缓冲区中写入消息时,只有对应于所接收消息的缓冲区会被修改,其余部分不会改变。

  数据类型datatype和count的含义和上面的MPI_SEND相同。

  看下面的简单例子。
  

  上面的例子中进程号为奇数的处理器发送数组a的内容给下一个处理器(进程号比自己大1的处理器,对进程号为npes-1的处理器,对应为处理器0),然后从上一个处理器(进程好比自己小1的处理器,对处理器0,对应为处理器npes-1)接收数据到数组b;对于进程号为偶数的处理器则正好相反,先接收b再发送a。如下图所示(为了方便,假设npes = 4)。
  

  上面的例子中进程号为奇数的处理器发送数组a的内容给下一个处理器(进程号比自己大1的处理器,对进程号为npes-1的处理器,对应为处理器0),然后从上一个处理器(进程好比自己小1的处理器,对处理器0,对应为处理器npes-1)接收数据到数组b;对于进程号为偶数的处理器则正好相反,先接收b再发送a。如下图所示(为了方便,假设npes = 4)。

最后的效果是每个处理器的b的内容都是上一个处理器的a的内容。

思考,上面的程序为什么不写成下面的简单形式?注意上面得通信操作是阻塞的。

答案:死锁