Прямая проблема: Мой 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, и найдите любое решение.