MPI_Bcasts зависает на подчиненном устройстве

Я пытаюсь ввести число на один компьютер, а затем передать его на все остальные компьютеры с помощью MPI.

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

int main (int argc, char** argv)
{

int myid, numprocs, processor_name_length;
char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Init (0, 0);
MPI_Comm_rank (MPI_COMM_WORLD, &myid);
MPI_Comm_size (MPI_COMM_WORLD, &numprocs);
MPI_Get_processor_name (processor_name, &processor_name_length);

int number = 0;
if (myid == 0) {
    printf ("Input number: ");
    scanf ("%d", &number);
}

MPI_Bcast(&number, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf ("Hello from process %d of %d. Number: %d [%s]\n", myid, numprocs, number, processor_name);

MPI_Finalize ();
return 0;

}

когда я его компилирую и запускаю:

mpicc -o bcast bcast.c
mpiexec -hosts umaster,uslavea -n 2 ./bcast

Он запрашивает ввод на главной машине, затем печатает это сообщение с помощью printf после того, как я ввожу номер, а затем зависает.

Выход:

Input number: 10
Hello from process 0 of 2. Number: 10 [umaster]

Должно быть сообщение:

Hello from process 1 of 2. Number: 10 [uslavea]

РЕДАКТИРОВАТЬ:

Если я запускаю эту команду:

mpiexec -hosts master -n 4 ./bcast

Все работает, также у меня есть еще один пример, где я использую MPI_Send(...), и я получаю сообщение об ошибке отказа в подключении, однако, если я запускаю этот пример на одном компьютере, все работает нормально. Я предполагаю, что моя конфигурация/кластер не в порядке. Следующий пример отлично работает:

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

int main (int argc, char** argv)
{
    int myid, numprocs;

    MPI_Init (0, 0);
    MPI_Comm_rank (MPI_COMM_WORLD, &myid);
    MPI_Comm_size (MPI_COMM_WORLD, &numprocs);
    printf ("Hello from process %d of %d.\n", myid, numprocs);
    MPI_Finalize ();
    return 0;
}

запустив его с помощью:

mpiexec -hosts master,uslavea,uslaveb,uslavec -n 4 ./hello

Я создал 4 виртуальные машины, сгенерировал ключи dsa, и я могу войти с каждой из них на каждую, используя ssh, не запрашивая пароль. (например, от мастера: ssh mpiuser@uslavea). На всех машинах пользователь mpiuser и пароль одинаковый для каждой машины.

В чем может быть проблема? Повторяю, запуск только на мастере с -n X работает нормально.


person clzola    schedule 17.12.2015    source источник
comment
Я не уверен, так что это просто комментарий. Я думаю, что слейв зависает на MPI_Get_processor_name(...), может потому что processor_name_length никогда не ставится.   -  person Soana    schedule 18.12.2015
comment
Я удалил это, и происходит то же самое ... если я удаляю MPI_Bcast(...), программа завершается нормально, иначе она зависает.   -  person clzola    schedule 18.12.2015
comment
НО это выглядит прекрасно и должно работать. Может быть, машины не видят друг друга/не могут общаться? Работают ли другие способы связи?   -  person Soana    schedule 18.12.2015
comment
@Soana, я отредактировал свой вопрос, поэтому, пожалуйста, проверьте его...   -  person clzola    schedule 18.12.2015
comment
Ваша реализация MPI случайно не Open MPI?   -  person Hristo Iliev    schedule 18.12.2015


Ответы (1)


Я понял. Проблема в том, что я использую имя для серверов вместо IP-адресов. Запуск

mpiexec -hosts 192.168.100.100,192.168.100.101,192.168.100.102,192.168.100.103 -n 4 ./bcast

решает проблему.

person clzola    schedule 17.12.2015
comment
Вы должны настроить псевдоним ваших IP-адресов для имен хостов, когда это возможно. Это помогло бы вам прямо сейчас и, конечно же, значительно облегчило бы жизнь разработчика позже. - person NoseKnowsAll; 18.12.2015
comment
мой /etc/hosts выглядит так 192.168.100.100 master 192.168.100.101 uslavea 192.168.100.102 uslaveb 192.168.100.103 uslavec каждый в новой строке - person clzola; 18.12.2015
comment
Эти записи в /etc/hosts на всех узлах? - person Hristo Iliev; 18.12.2015
comment
да, но неважно, это было домашнее задание, оно работает с IP, так что я закончил :D - person clzola; 20.12.2015