Как обмениваться данными между различными процессами с использованием MPI - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь использовать MPI_Sendrecv для обмена данными между процессами, но попадаю в логику отправки и получения.

Предположим, что у нас есть четыре процесса, и у каждого из них есть 2 одномерных массива размером 4: Params и Params_. Записи Params будут инициализированы как rank * 4 + i (например, в ранге процесса 0, Params = {0,1,2,3}), тогда как Params_ используется для хранения Params, отправленного другими процессами. Каждый процесс собирается отправить свой params другим и получить params от других. Код выглядит следующим образом.

#include<mpi.h>
#include<stdio.h>

int main(int argc, char **argv){
  int my_rank, ncpus;
  MPI_Status status;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
  MPI_Comm_size(MPI_COMM_WORLD, &ncpus);

  double *params;
  double *params_;
  int Nparams = 4;

  params = new double[Nparams];
  params_ = new double[Nparams];

  // Initialize params and print it
  printf("ID %d: ", my_rank);
  for (int i = 0; i < Nparams; i++) {
    params[i] = my_rank * ncpus + i;
    printf("%g  ", params[i]);
  }
  printf("\n");

  // Receive params from the other processes, store it in params_, and print it
  for (int i = 0; i < ncpus; i++) {
    MPI_Sendrecv(params, Nparams, MPI_DOUBLE, i, 0, params_, Nparams, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &status);
    printf("Receive params from %d: ", i);
    for (int i = 0; i < Nparams; i++)
      printf("%g  ", params_[i]);
    printf("\n");
  }

  delete[] params;
  delete[] params_;
  MPI_Finalize();
  return 0;
}

Вывод кода ничего не показывает (даже не может распечатать Params), и есть много предупреждений, таких как WARNING: There was an error initializing an OpenFabrics device. Не могли бы вы помочь мне понять, почему это не работает и что я должен делать. Большое спасибо!

...