Доступ к значению соседних процессов в топологии MPI - PullRequest
0 голосов
/ 29 сентября 2018

Я реализовал декартову топологию, моделирующую сетку 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 голосов
/ 29 сентября 2018

Вы можете думать о связи MPI как происходящей по фазам.Вы можете делать то, что вам нужно, с четырьмя фазами.На каждой фазе каждый узел отправляет свое значение своему соседу {справа, слева, сверху, снизу} (если такого соседа нет).

Одним из способов является использование MPI_Isend, который не является блокирующим,Это означает, что на первом этапе каждый узел отправляет направо, а затем получает слева.

...