клиент-серверное приложение с использованием MPI - PullRequest
0 голосов
/ 11 января 2012

у меня два вопроса; Первый из них:

Я собираюсь использовать msmpi, и я имел в виду "только mpi", что мы не должны использовать сокеты, мое приложение о масштабируемой распределенной структуре данных; изначально у нас есть сервер, содержащий файл, который имеет переменный размер (размер может быть увеличен за счет вставок и может быть уменьшен за счет удаления), а когда размер файла превысит определенный предел, файл будет разделен, половина останется на первом сервере и вторая половина будет перенесена на новый сервер и так далее ... и клиент должен быть всегда проинформирован адресом данных, которые он хочет получить, чтобы у него было изображение операции разделения файла. наконец, я надеюсь, что проясню.

и второй:

Я пытался скомпилировать простое клиент-серверное приложение (источник кода ниже) с помощью msmpi или mpich2, и оно не работает и выдает мне сообщение об ошибке «Неустранимая ошибка в mpi_open_port () и другие ошибки стека» , поэтому я установил open mpi на ubunto 11.10 и попытался запустить тот же пример, он работал на стороне сервера и дал мне имя порта, но на стороне клиента он выдал мне сообщение об ошибке:

[user-Compaq-610:03833] [[39604,1],0] ORTE_ERROR_LOG: Not found in file ../../../../../../ompi/mca/dpm/orte/dpm_orte.c at line 155
[user-Compaq-610:3833] *** An error occurred in MPI_Comm_connect
[user-Compaq-610:3833] *** on communicator MPI_COMM_WORLD
[user-Compaq-610:3833] *** MPI_ERR_INTERN: internal error
[user-Compaq-610:3833] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
--------------------------------------------------------------------------
mpirun has exited due to process rank 0 with PID 3833 on
node toufik-Compaq-610 exiting without calling "finalize". This may
have caused other processes in the application to be
terminated by signals sent by mpirun (as reported here).

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

исходный код здесь:

/* the server side */
#include <stdio.h>
#include <mpi.h>

main(int argc, char **argv)
{
    int my_id;
    char port_name[MPI_MAX_PORT_NAME];
    MPI_Comm newcomm;
    int passed_num;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_id);

    passed_num = 111;

    if (my_id == 0)
    {
    MPI_Open_port(MPI_INFO_NULL, port_name);
    printf("%s\n\n", port_name); fflush(stdout);
    } /* endif */

    MPI_Comm_accept(port_name, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm); 

    if (my_id == 0)
    {
    MPI_Send(&passed_num, 1, MPI_INT, 0, 0, newcomm);
    printf("after sending passed_num %d\n", passed_num); fflush(stdout);
    MPI_Close_port(port_name);
    } /* endif */

    MPI_Finalize();

    exit(0);

} /* end main() */

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

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

int main(int argc, char **argv)
{
    int passed_num;
    int my_id;
    MPI_Comm newcomm;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_id);

    MPI_Comm_connect(argv[1], MPI_INFO_NULL, 0, MPI_COMM_WORLD, &newcomm); 

    if (my_id == 0)
    {
    MPI_Status status;
    MPI_Recv(&passed_num, 1, MPI_INT, 0, 0, newcomm, &status);
    printf("after receiving passed_num %d\n", passed_num); fflush(stdout);
    } /* endif */

    MPI_Finalize();

    return 0;   
    //exit(0);

} /* end main() */

1 Ответ

0 голосов
/ 13 января 2012

Как именно вы запускаете приложение?Кажется, что предоставленные клиентский и серверный коды совпадают.

Обычно код одинаков для всех процессов MPI, и программа решает, что выполнять, основываясь на рейтинге, как в этом фрагменте if (my_id == 0) { ... }.Приложение выполняется с mpiexec .Например, mpiexec -n 2 ./application будет запускать два процесса MPI с рангами 1 и 2 в одном MPI_COMM_WORLD коммуникаторе.Где именно будут выполняться процессы (на одном и том же узле или на разных), зависит от конфигурации.

Тем не менее, вы должны создать порт с MPI_Open_port и передать его на MPI_Comm_connect.Вот пример использования этих функций: MPI_Comm_connect

Более того, для MPI_Recv должен быть соответствующий MPI_Send.В противном случае процесс получения будет ждать вечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...