Я пытаюсь построить пример сервера-клиента 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.
Начать отправку ...
Отправьте запрос на отключение!
Отключите сервер!
Он никогда не печатает «Завершить!».
Что может вызвать эту проблему?