застрял после вызова MPI_Comm_disconnect с обеих сторон, сервера и клиента - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь построить пример сервера-клиента MPI, найденный здесь: https://www.mpi -forum.org / docs / mpi-3.1 / mpi31-report / node248.htm # Node248 .Запуск сервера и клиента выглядит нормально, за исключением того, что он всегда зависает после вызова MPI_Comm_disconnect.

на стороне сервера

#include <iostream>
#include <mpi.h>
int main (int argc, char ** argv) {
  MPI_Comm client;
  MPI_Sttus status;
  char port_name[MPI_MAX_PORT_NAME];
  int size, again, i;

  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  if (size != 1) {
    std::cerr << "Server MPI processors must be 1!\n";
    exit(EXIT_FAILURE);
  }

  MPI_Open_port(MPI_INFO_NULL, port_name);
  std::cout << "SERVER: " << port_name << std::endl;

  while (1) {
    std::cout << "Waiting for a client ...\n";
    MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &client);
    again = 1;
    while (again) {
      MPI_Recv(&i, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, client, &status);
      switch(status.MPI_TAG) {
      case 0:
        std::cout << "Shut down server!\n";
        MPI_Comm_free(&client);
        MPI_Close_port(port_name);
        MPI_Finalize();
        return EXIT_SUCCESS;

      case 1:
        std::cout << "Disconnect client!\n";
        MPI_Comm_disconnect(&client);
        std::cout << "check\n";
        again = 0;
        break;

      case 2:
        std::cout << "Received: " << i << std::endl;
        break;

      default:
        std::cerr << "Abort with unknown tag!\n;
        MPI_Abort(MPI_COMM_WORLD, 1);
        break;
      }
    }
  }
  MPI_Finalize();
  return EXIT_SUCCESS;
}

на стороне клиента

#include <iostream>
#include <mpi.h>

int main (int argc, char ** argv)
{
  MPI_Comm server;
  char port_name[MPI_MAX_PORT_NAME];
  int i, tag;

  if (argc < 2) {
    std::cerr << "Server port name required!\n";
    exit(EXIT_FAILURE);
  }

  MPI_Init(&argc, &argv);
  strcpy(port_name, argv[1]);
  std::cout << "Server at " << port_name << std::endl;
  MPI_Comm_connect(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server);
  std::cout << "Start send ...\n";
  for (i = 0; i < 5; i++) {
    tag = 2;
    MPI_Send(&i, 1, MPI_INT, 0, tag, server);
  }
  std::cout << "Send disconnect request!\n";
  tag = 1;
  MPI_Send(&i, 1, MPI_INT, 0, tag, server);

  std::cout << "Disconnect server!\n";
  MPI_Comm_disconnect(&server);
  std::cout << "Finalize!\n";
  MPI_Finalize();
  return EXIT_SUCCESS;
}

Сначала я запустил сервер:

mpirun -n 1 сервер

Затем он напечатает следующие сообщения

Сервер доступен на порту: [здесь имя портаи использовал это как входной аргумент клиентского кода]

Ожидание соединения ....

Затем я запустил клиент:

mpirun-n 1 клиент [имя порта скопировано сверху]

Затем сервер завис после MPI_Comm_disconnect.

Получено: 0

Получено: 1

Получено: 2

Получено: 3

Получено: 4

Отключите клиент!

Проверка никогда не распечатывается! ".

На стороне клиента он также зависает после MPI_Comm_disconnect.

Начать отправку ...

Отправьте запрос на отключение!

Отключите сервер!

Он никогда не печатает «Завершить!».

Что может вызвать эту проблему?

...