MPI_Bcasts 挂在奴隶上
MPI_Bcasts hangs on slave
我正在尝试在一台计算机上输入一个数字,然后使用 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
它提示我在 master 机器上输入,然后在我输入数字后用 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(...)
并且出现连接被拒绝的错误,但是如果我 运行 该示例在单台计算机上一切正常。我假设我的 configuration/cluster 不正常。下一个例子工作正常:
#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,每台机器的密码都相同。
可能是什么问题?我重复 运行 只在 master 上用 -n X
工作正常。
我明白了。问题是我使用服务器名称而不是 IP 地址。 运行它
mpiexec -hosts 192.168.100.100,192.168.100.101,192.168.100.102,192.168.100.103 -n 4 ./bcast
解决问题。
我正在尝试在一台计算机上输入一个数字,然后使用 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
它提示我在 master 机器上输入,然后在我输入数字后用 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(...)
并且出现连接被拒绝的错误,但是如果我 运行 该示例在单台计算机上一切正常。我假设我的 configuration/cluster 不正常。下一个例子工作正常:
#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,每台机器的密码都相同。
可能是什么问题?我重复 运行 只在 master 上用 -n X
工作正常。
我明白了。问题是我使用服务器名称而不是 IP 地址。 运行它
mpiexec -hosts 192.168.100.100,192.168.100.101,192.168.100.102,192.168.100.103 -n 4 ./bcast
解决问题。