是否需要分配整个域网格

时间:2017-05-26 18:01:14

标签: c mpi

我编写了一个小应用程序,用MPI库解决了部分方程式。

对于每个MPI排名,我分配整个网格域来解决。代码的结构如下:

  1. 为整个域分配全局数组

  2. 使用MPI_Cart_shift

  3. 定义邻居
  4. 计算名为" me"

    的当前MPI等级的子域(在网格上)的坐标(xs,ys)(开始)和(xe,ye)(结束)
  5. 更新当前MPI等级的边界

  6. 进入主循环:

  7. // 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),那么我会从这个主循环中断。

    1. 然后,我通过执行以下操作收集最终数组xfinal中的所有子域:
    2. 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排名分配一个子域?

      提前致谢。

0 个答案:

没有答案