Запуск C ++ клиент / сервер для параллельной обработки с использованием MPI - PullRequest
0 голосов
/ 13 апреля 2020

Введение

Чтобы распараллелить числовую интеграцию в C ++, я хочу использовать подход клиент / сервер на моей локальной машине. Для этого я использую интерфейс передачи сообщений для C ++ .

Мой код

Итак, я сначала попробовал установку hello world, где я отправлю сообщение от клиента на сервер. Для этого у меня есть два файла в одном каталоге. Вот код для Сервера, server.cpp:

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

int size, rank, msg;

int main(int argc, char *argv[]){
    MPI_Comm client;
    MPI_Status status;
    char portname[MPI_MAX_PORT_NAME];

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);

    MPI_Open_port(MPI_INFO_NULL, portname);
    printf("portname: %s\n", portname);
    MPI_Comm_accept(portname, MPI_INFO_NULL, 0, MPI_COMM_SELF, &client);
    printf("client connected\n");
    MPI_Recv(&msg, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, client, &status);
    printf("msg: %d\n", msg);
    MPI_Comm_free(&client);
    MPI_Close_port(portname);
    MPI_Finalize();
}

Вот код для Клиента, client.cpp:

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

int size, rank;
int main(int argc, char *argv[]){
    MPI_Comm server;
    int msg, tag, dest;
    char portname[MPI_MAX_PORT_NAME];

    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    if (argc >= 2){
        printf("Trying connect to %s\n", argv[1]);
        strcpy(portname, argv[1]);
        MPI_Comm_connect(portname, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &server);
        msg = 42; tag = 0; dest = 0;
        MPI_Send(&msg, 1, MPI_INT, dest, tag, servidor);
        MPI_Comm_disconnect(&server);
    }
    MPI_Finalize();
}

Как я пытался запустить свой код

Я скомпилировал клиента и сервера, используя mpiCC -g -Wall -o client.out client.cpp и mpiCC -g -Wall -o server.out server.cpp соответственно.

Теперь я открываю два разных терминала и использую mpirun -np 1 ./server.out в первом терминале для запуска сервера. Это дает мне имя порта, чтобы я мог использовать mpirun -np 1 ./client.out <PORTNAME> во втором терминале для запуска клиента. Однако я получаю следующую ошибку:

Trying connect to <PORTNAME>
--------------------------------------------------------------------------
The user has called an operation involving MPI_Connect and/or MPI_Accept
that spans multiple invocations of mpirun. This requires the support of
the ompi-server tool, which must be executing somewhere that can be
accessed by all participants.

Please ensure the tool is running, and provide each mpirun with the MCA
parameter "pmix_server_uri" pointing to it.
--------------------------------------------------------------------------
--------------------------------------------------------------------------
Your application has invoked an MPI function that is not supported in
this environment.

  MPI function: MPI_Comm_connect
  Reason:       Underlying runtime environment does not support accept/connect functionality
--------------------------------------------------------------------------
[ubuntu-workstation:00101] *** An error occurred in MPI_Comm_connect
[ubuntu-workstation:00101] *** reported by process [23056836,0]
[ubuntu-workstation:00101] *** on communicator MPI_COMM_WORLD
[ubuntu-workstation:00101] *** MPI_ERR_INTERN: internal error
[ubuntu-workstation:00101] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[ubuntu-workstation:00101] ***    and potentially your MPI job)

То, что я пытался

Я нашел это сообщение в блоге , где происходит очень похожая ошибка.

Кажется, мне нужно только запустить этот зловещий "инструмент ompi-сервера", однако, будучи новичком в MPI, я понятия не имею, где найти этот инструмент и как его запустить ... Так как я могу исправить ошибку?

1 Ответ

1 голос
/ 13 апреля 2020

К сожалению, похоже, что последней версией Open MPI, которая имеет работающую функцию приема / подключения, является Open MPI 1.6.5. Начиная с v1.7, поддержка нарушена, а в ORTE 2.x необходимая поддержка отсутствует вообще, и ее реализация имеет низкий приоритет, как указано в выпуске . Вы должны либо каким-либо образом реализовать свое решение без функциональности клиент / сервер, перейти на Open MPI 1.6.5 или просто переключиться на MPICH или Intel MPI. Последний теперь бесплатен для использования как часть oneAPI, и я только что проверил, работает ли ваш код с ним после исправления опечатки в client.cpp (server вместо servidor).

...