Сбой MPI_Gather в кластере CentOS 7 Oracle VM VirtualBox при хорошей работе в реальном кластере - PullRequest
0 голосов
/ 27 ноября 2018

Прямая проблема: Мой MPI_Gather_demo (как указано ниже) очень прост.Но он не может работать в моем кластере виртуальных машин.

[mindle@master shared_folder]$ mpirun -n 4 --hosts master,node1 ./MPI_Gather_demo
[mpiexec@master.cluster] control_cb (pm/pmiserv/pmiserv_cb.c:200): assert (!closed) failed
[mpiexec@master.cluster] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:76): callback returned error status
[mpiexec@master.cluster] HYD_pmci_wait_for_completion (pm/pmiserv/pmiserv_pmci.c:198): error waiting for event
[mpiexec@master.cluster] main (ui/mpich/mpiexec.c:344): process manager error waiting for completion
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <mpi.h>

void print_short_array(short *array, int size);

int main() {
#define MASTER 0

    MPI_Init(NULL, NULL);

    int world_size, world_rank;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    short *sum_data = NULL;

    short local_data = world_rank + 1;

    if (world_rank == MASTER) {
        sum_data = (short *)malloc(world_size * sizeof(short));
        assert(sum_data != NULL);
    }

    // ---- the function is here ----
    MPI_Gather(&local_data, 1, MPI_SHORT, sum_data, 1, MPI_SHORT,
        MASTER, MPI_COMM_WORLD);

    if (world_rank == MASTER) {
        print_short_array(sum_data, world_size);
    }

    MPI_Finalize();
    return 0;
}

void print_short_array(short *array, int size) {
    printf("{");
    int i;
    for (i = 0; i < size; i++) {
        if (i == size - 1)
            printf("%d}\n", array[i]);
        else
            printf("%d, ", array[i]);
    }
}

Но он может нормально работать на одной виртуальной машине, например:

[mindle@master shared_folder]$ mpirun -n 4 ./MPI_Gather_demo
{1, 2, 3, 4}

И в реальном кластере (четыре E-HPC-узлы облако Alibaba ), программа также может работать.

Среда: Я использовал MPI в виртуальном кластере с использованием Oracle VM VirtualBox в CentOS 7 .Я использую реализацию MPI mpich-3.2 .

Я установил все в порядке:

  • статический IP-адрес для каждой виртуальной машины
  • SSH без пароля между мастером и узлами
  • / и т. Д./ hosts добавляет адреса ip в каждую ВМ, ping в порядке

Кроме того: для другой тестовой программы с именем MyMPI_Hello.c ( здесь ,который не использовал MPI_Gather), мой кластер виртуальных машин может работать нормально.

[mindle@master mpi_cloud]$ mpirun -n 4 -f mpi_file /mpi_cloud/a.out 
Hello World! Process 0 of 4 on master.cluster
Hello World! Process 1 of 4 on node1.cluster
Hello World! Process 2 of 4 on node2.cluster
Hello World! Process 3 of 4 on node3.cluster

Основная проблема заключается в , почему функция MPI_Gather вылетает в моем кластере виртуальных машин , в то время как она работаетнормально в реальном кластере.

Хотите воспроизвести: Если у вас кластер виртуальных машин, проверьте, не воспроизведете ли вы мою ошибку, используя MPI_Gather_demo.c, и найдите любое решение.

...