📄 mpi374.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE> ICPSEP Content
</TITLE>
<META NAME="GENERATOR" CONTENT="Mozilla/3.0Gold (X11; I; SunOS 5.4 sun4m) [Netscape]">
</HEAD>
<BODY BGCOLOR="#F0F8FF">
<TABLE WIDTH="100%" >
<TR>
<TD align=left><FONT SIZE=+2>3.7.4 非阻塞通信的语义 </FONT></TD>
<TD align=right><A HREF="mpi373.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi373.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A><A HREF="mpi375.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi375.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A>
</TD>
</TR>
</TABLE>
<P>
<HR WIDTH="100%"></P>
<P>我们通过适当地扩展<A HREF="mpi35.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi35.htm">3.5节</A>的定义来定义非阻塞通信的语义。
</P>
<P><B>Order(顺序) </B>按着调用初始化通信的执行顺序安排非阻塞通信操作的顺序。给非阻塞通信用使用顺序的定义扩展<A HREF="mpi35.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi35.htm">3.5节</A>的非赶超请求。
</P>
<P>例子3.12 非阻塞操作排序的消息。 </P>
<P>CALL MPI_COMM_RANK(comm, rank, ierr) <BR>
IF (RANK.EQ.0) THEN <BR>
CALL MPI_ISEND(a, 1, MPI_REAL, 1, 0, comm, r1, ierr) <BR>
CALL MPI_ISEND(B, 1, MPI_REAL, 1, 0, comm, r2, ierr) <BR>
ELSE ! rank.EQ.1 <BR>
CALL MPI_IRECV(a, 1, MPI_REAL, 0, MPI_ANY_TAG, comm, r1, ierr) <BR>
CALL MPI_IRECV(b, 1, MPI_REAL, 0, 0, comm, r2, ierr) <BR>
END IF <BR>
CALL MPI_WAIT(r1,status) <BR>
CALL MPI_WAIT(r2,status) </P>
<P>进程0的第一个发送将匹配进程1的第一个接收, 既使在进程1执行接收以前, 两个消息已被发送。
</P>
<P><B>Progress(进度)</B> 除非这个发送被另一个接收满足, 如果一个匹配发送已被开始,
那么完成一个接收的对MPI_WAIT的一个调用将最终结束并返回。特别,如果这个匹配发送是非阻塞的,那么这个接收将完成,既使完成这个发送的发送者不执行调用。类似地,除非这个接收被另一个发送满足,
如果一个匹配接收已被开始, 一个完成发送的对MPI_WAIT的一个调用将最终返回,
既使没有完成这个接收的调用执行。 </P>
<P>例子 3.13 进度语义的一个解释。 </P>
<P>CALL MPI_COMM_RANK(comm, rank, ierr) <BR>
IF (rank.EQ.0) THEN <BR>
CALL MPI_SSEND(a, 1, MPI_REAL, 1, 0, comm, ierr) <BR>
CALL MPI_SEND(b, 1, MPI_REAL, 1, 1, comm, ierr) <BR>
ELSE ! rank.EQ.1 <BR>
CALL MPI_IRECV(a, 1, MPI_REAL, 0, 0, comm, r, ierr) <BR>
CALL MPI_RECV(b, 1, MPI_REAL, 0, 1, comm, ierr) <BR>
CALL MPI_WAIT(r, status, ierr) <BR>
END IF </P>
<P>在一个正确的MPI实现中, 这个代码将不死索。进程0的第一个同步发送必须在进程1登入这个匹配接收后完成,
既使进程1还没有得到“完成等待调用”。所以,进程0将继续和执行第二个发送,
允许进程1完成执行。 </P>
<P>如果一个完成一个接收的MPI_TEST用同一参数被重复地调用, 并且一个匹配发送已开始,
那么这个调用将最终返回flag = 真, 除非这个发送由另一个接收满足。如果完成一个发送的MPI_TEST用同一个参数重复地被调用,
并且一个匹配接收已被开始, 那么这个调用将最终返回flag = 真, 除非这个接收由另一个发送满足。
</P>
<P>
<HR WIDTH="100%"></P>
<TABLE WIDTH="100%" >
<TR>
<TD align=left>Copyright: NPACT <BR>
</TD>
<TD align=right><A HREF="mpi373.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi373.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A><A HREF="mpi375.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi375.htm"><IMG SRC="forward.gif" tppabs="http://arch.cs.pku.edu.cn/image/forward.gif" ALT="FORWARD" HEIGHT=32 WIDTH=32></A>
</TD>
</TR>
</TABLE>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -