我编写了一个小应用程序,用MPI库解决了部分方程式。
对于每个MPI排名,我分配整个网格域来解决。代码的结构如下:
为整个域分配全局数组
使用MPI_Cart_shift
计算名为" me"
的当前MPI等级的子域(在网格上)的坐标(xs,ys)
(开始)和(xe,ye)
(结束) 更新当前MPI等级的边界
进入主循环:
// Main loop
while(!convergence)
{
step = step + 1;
t = t + dt ;
/* Perform one step of the explicit scheme */
Explicit(x0, x, dt, &resLoc, hx, hy, me, xs, ys, xe, ye, k0);
/* Update the partial solution along the interface */
updateBound(x0, NeighBor, comm2d, column_type, me, xs, ys, xe, ye, xcell);
/* Reduce all cartesian subgrids for convergence */
MPI_Allreduce(&resLoc, &result, 1, MPI_DOUBLE, MPI_SUM, comm);
result= sqrt(result);
if ((result<epsilon) || (step>maxStep)) break;
}
代码保持在主循环中,直到达到收敛。进入Explicit
,我计算当前迭代的下一个值。然后,我更新每个子域的deges,然后我发送/接收它们给邻居。
最后,我通过减少误差来计算当前迭代的收敛值。
如果错误小于定义的收敛(result < epsilon
),那么我会从这个主循环中断。
xfinal
中的所有子域:
MPI_Gather(xtemp,xcell*ycell, MPI_DOUBLE, xfinal, xcell*ycell, MPI_DOUBLE, 0, comm);
然后,我将解决方案(xfinal
数组)打印到输出文件中。
我的问题是,不知道如何避免为每个MPI排名分配整个域数组:实际上,如果2D域的大小非常高,则每个单个节点上可能没有足够的RAM内存分配我使用的两个2D数组(x[i][j]
和x0[i][j]
)。
我不知道每个MPI流程是否可以只分配一个子域:但在这种情况下,如何在它们之间进行通信?我需要一个完整的域来发送和接收进程之间的行/列,不是吗?
如果有人可以帮助我并告诉我是否可以为每个MPI排名分配一个子域?
提前致谢。