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

时间:2018-09-29 09:42:45

标签: c mpi hpc

我已经实现了对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 个答案:

答案 0 :(得分:0)

您可以认为MPI通信是分阶段进行的。您可以通过四个阶段来完成所需的工作。在每个阶段,每个节点都会将其值发送到{right,left,top,bottom}上的邻居(除非没有此类邻居)。

一种方法是使用MPI_Isend,这是非阻塞的。这意味着在第一阶段,每个节点向右发送然后从左接收。