📄 mpi66.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE> ICPSEP Content
</TITLE>
<META NAME="GENERATOR" CONTENT="Mozilla/3.0Gold (Win95; I) [Netscape]">
</HEAD>
<BODY BGCOLOR="#F0F8FF">
<TABLE WIDTH="100%" >
<TR>
<TD align=left>
<H2>6.6 一个应用例子</H2>
</TD>
<TD align=right><A HREF="mpi657.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi657.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A>
<A HREF="mpi71.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi71.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>例 6.6 图6.1的例子显示怎样在应用程序中使用网格定义和查询函数。一个偏微分方程,例如帕松等式,在规则域中解决。首先,进程将自己组织在二维结构中。每一进程然后在四个方向上(上,下,左,右)查询邻居的标识数。通过迭代方法解决数字问题,详细信息隐含在子程序relax中。
</P>
<P>在每一松弛步中,每一进程在进程所拥有点上对解析格子函数计算新值。然后在交互进程的边缘上的值不得不同邻居进程相互交换。例如,交换子程序可以包含调用MPI_SEND(…,
neigh_rank(1),…),以发送被更新的值到左手邻居(I-1, j)。</P>
<UL>
<P>integer ndims, num_neigh</P>
<P>logical reorder</P>
<P>parameter (ndims=2, num_neigh=4, reorder=.true.)</P>
<P>integer comm, comm_cart, dims (ndims), neigh_def (ndims), ierr</P>
<P>integer neigh_rank (num_neigh), own_position (ndims), i , j</P>
<P>logical periods (ndims)</P>
<P>real*8 u (0:101, 0:101), f (0:101, 0:101)</P>
<P>data dims / ndims * 0 /</P>
<P>comm = MPI_COMM_WORLD</P>
</UL>
<P>C Set process grid size and periodicity</P>
<UL>
<P>call MPI_DIMS_CREATE (comm, ndims, dims, ierr)</P>
<P>periods (1) = .TRUE.</P>
<P>periods (2) = .TRUE.</P>
</UL>
<P>C Create a grid structure in WORLD group and inquire about own position</P>
<UL>
<P>call MPI_CART_CREATE ( comm, ndims, dims, periods, reorder, comm_cart,
ierr)</P>
<P>call MPI_CART_GET (comm_cart, ndims, dims, periods, own_position, ierr)</P>
</UL>
<P>C Look up the ranks for the neighbors, Own process coordinates are (i,
j)。</P>
<P>C Neighbors are (I-1, j), (I, j+1), (I, j-1), (I, j+1)</P>
<UL>
<P>I = own_position(1)</P>
<P>I = own_position(2)</P>
<P>neigh_def(1) = I-1</P>
<P>neigh_def(2) = j</P>
<P>call MPI_CART_RANK(comm_cart, neigh_def, neigh_rank(1), ierr)</P>
<P>neigh_def(1) = i+1</P>
<P>neigh_def(2) = j</P>
<P>call MPI_CART_RANK(comm_cart, neigh_def, neigh_rank(2), ierr)</P>
<P>neigh_def(1) = i</P>
<P>neigh_def(2) = j-1</P>
<P>call MPI_CART_RANK(comm_cart, neigh_def, neigh_rank(3), ierr)</P>
<P>neigh_def(1) = i</P>
<P>neigh_def(2) = j+1</P>
<P>call MPI_CART_RANK(comm_cart, neigh_def, neigh_rank(4), ierr)</P>
</UL>
<P>C Initialize the grid functions and start the iteration</P>
<UL>
<P>call init (u, f)</P>
<P>do 10 it = 1, 100</P>
<P>call relax (u, f)</P>
</UL>
<P>C Exchange data with neighbor processes</P>
<UL>
<P>call exchange (u, comm_cart, neigh_rank, num_neigh)</P>
<P>10 continue</P>
<P>call output (u)</P>
<P>end</P>
</UL>
<P>
<HR WIDTH="100%"></P>
<TABLE WIDTH="100%" >
<TR>
<TD align=left>Copyright: NPACT </TD>
<TD align=right><A HREF="mpi657.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi657.htm"><IMG SRC="backward.gif" tppabs="http://arch.cs.pku.edu.cn/image/backward.gif" ALT="BACKWARD" HEIGHT=32 WIDTH=32></A>
<A HREF="mpi71.htm" tppabs="http://arch.cs.pku.edu.cn/parallelprogramming/mpispec/mpi71.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 + -