直接问题:我的MPI_Gather_demo
(如下所示)非常简单。但是它不能在我的VM群集中工作。
[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]);
}
}
但是它可以在单个VM中正常工作,如下所示:
[mindle@master shared_folder]$ mpirun -n 4 ./MPI_Gather_demo
{1, 2, 3, 4}
在一个真实的群集(Alibaba cloud的四个E-HPC节点)中,该程序也可以正常工作。
环境:我在 CentOS 7 中使用 Oracle VM VirtualBox 在虚拟集群中使用了MPI。我正在使用的MPI实现是 mpich-3.2 。
我将这些设置为OK:
ping
可以 此外:对于另一个名为MyMPI_Hello.c
(here,未使用MPI_Gather
)的测试程序,我的VM群集可以正常工作。>
[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
功能在我的VM群集中崩溃,而在实际群集中却无法正常工作。
要复制::如果您有VM群集,请检查是否要使用MPI_Gather_demo.c复制我的错误并找到任何解决方案。