3.10 发送_接收 / 3.11空进程(Null processes) BACKWARDFORWARD


(Send_receive) send-receive操作把发送一个消息到一个目的地和从另一个进程接收一个消息合并到一个调用中.源和目的可以是同一个地方.一个send-receive操作对穿过一个进程链的切换操作非常有用.如果阻塞的发送和接收被用于这种切换,则需要正确排列发送和接收的顺序(例如偶数进程发送,然后接收,奇数进程先接收,然后发送)以避免循环以赖导致死锁. 当使用一个send-receive时,通信子系统处理这些问题.send-receive操作可以用于连接第6章介绍的函数以获得在各种逻辑拓朴上的性能切换. 另外,send-receive操作对执行远程过程调用非常有用.

一个由send-receive发出的消息可以被一个普通接收操作接收,或被一个检查操作检查;一个-send-receive操作可以接收一个普通发送操作发送的消息.

MPI_SENDRECV(sendbuf,sendcount,sendtype,dest,sendtag,
   recvbuf,recvcount,recvtype, source,recvtag,comm,status) 
int MPI_Sendrecv(void *sendbuf, int sendcount, 
      MPI_Datatype sendtype, int dest, int sendtag, void *recvbuf, 
      int recvcount, MPI_Datatype recvtype, int source, int recvtag, 
      MPI_Comm comm, MPI_Status *status) 
MPI_SENDRECV(SENDBUF,SENDCOUNT,SENDTYPE,DEST,SENDTAG,RECVBUF, 
   RECVCOUNT,RECVTYPE,SOURCE,RECVTAG,COMM,STATUS,
   IERROR) SENDBUF(*),RECVBUF(*) 
INTEGER SENDCOUNT, SENDTYPE,DEST,SENDTAG,RECVCOUNT,
RECVTYPE SOURCE,RECVTAG,COMM,STATUS(MPI_STATUS_SIZE),IERROR 

该操作执行一个阻塞的发送和接收.接收和发送使用同一个通信子,但是可能使用不同的标识.发送缓冲区和接收缓冲区必须分开, 他们可以是不同长度和类型.

MPI_SENDRECV_REPLACE(buf,count,datatype,dest,sendtag,source,recvtag,
comm,status) 
int MPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, int dest, int sendtag, int source,int recvtag, MPI_Comm comm, MPI_Status *status) 
MPI_SENDRECV_REPLACE(BUF,COUNT,DATATYPE,DEST,SENDTAG,SOURCE,RECVTAG,COMM,STATUS,IERROR) BUF(*) 

执行一个阻塞的发送和接收.接收和发送使用同一个缓冲区,使得发送的消息可以被接收的消息覆盖

等价于send-receive操作的情况是.调用者派生两个同步线索,一个执行发送,一个执行接收,然后这两个线索联合(join).

##对执行者的建议##

改变"替换"("replace")需要附加的中间缓冲区.


3.11 空进程(Null processes)


在很多情况下为通信指定一个"假"的源或目标是非常方便的.这可以简化处理边界的代码,例如,用调用send-receive实现非循环切换的时候.

MPI_PROC_NULL这个特殊的值可以用来替换一个调用所要求的源或目标序列.一个使用MPI_PROC_NULL进程的通信没有动作.一个给MPI_PRC_NULL的发送会立即成功返回.一个从MPI_PROC_NULL的接收会立即成功返回,对接收缓冲区没有任何改变.当用source=MPI_PROC_NULL执行一个接收时状态目标返回source=MPI_PROC_NULL,tag=MPI_ANY_TAG,count=0.


Copyright: NPACT BACKWARDFORWARD