代码之家  ›  专栏  ›  技术社区  ›  Maxxx

访问MPI拓扑中的邻居进程值

  •  0
  • Maxxx  · 技术社区  · 6 年前

    我已经实现了一个笛卡尔拓扑建模3x3网格:

    enter image description here

    其中p0、p1等表示过程0、过程1等。因此,拓扑中的每个槽表示一个进程。VAL表示进程包含的值。

    我现在想做的是 核对总数 每个进程的 邻居的价值 看看是不是 总计300 。如果有,则输出:

    Process 1 neighbour values sums up to 300.
    Process 3 neighbour values sums up to 300.
    Process 5 neighbour values sums up to 300.
    .
    .
    

    邻居们不是 左上下或右 . 我已经编写了模拟上述图表的代码:

    #include <stdio.h>
    #include "mpi.h"
    int main(int argc, char *argv[])
    {
      int value;
      int sum;
      int rank;
      int size;
      int coordinates[2];
    
      MPI_Comm grid_comm;
    
      int dim[2],false = 0,reorder;
      int top,bottom,right,left; 
    
      MPI_Status status;
    
      MPI_Init(&argc,&argv); 
      MPI_Comm_rank(MPI_COMM_WORLD,&rank);
      MPI_Comm_size(MPI_COMM_WORLD,&size);
    
      dim[0] = 3;
      dim[1] = 3;
      reorder = 0;
      MPI_Cart_create(MPI_COMM_WORLD,2,dim,&false,reorder,&grid_comm);
    
      MPI_Cart_shift(grid_comm,0,1,&top,&bottom);
      MPI_Cart_shift(grid_comm,1,1,&left,&right);
    
      MPI_Comm_rank(grid_comm,&rank);
    
      MPI_Cart_coords(grid_comm,rank,2,coordinates);
      MPI_Cart_rank(grid_comm,coordinates,&rank);
    
      if (rank % 2 == 0) {
          value *=100;
      }
      else {
          value *=200;
      }
    
      MPI_Finalize();
      return 0;
    }
    

    我现在面临的问题是 访问邻居值 在笛卡尔网格中。我想就如何做到这一点提出一些建议。

    1 回复  |  直到 6 年前
        1
  •  0
  •   John Zwinck    6 年前

    您可以认为MPI通信是分阶段进行的。你可以用四个阶段来做你需要做的事情。在每个阶段中,每个节点都将其值发送到右、左、上、下的邻居(除非没有这样的邻居)。

    一种方法是使用MPI-ISEND,它是非阻塞的。这意味着在第一个阶段中,每个节点发送到右边,然后从左边接收。