我有一个非常简单的MPI程序,其中节点0向节点1发送一个字符,但是每当我使用两台或更多台不同的机器时,发送和接收都会卡住。当我在一台机器中使用多个进程时,该程序工作正常。这似乎是一个沟通问题,但我无法弄清楚它是什么......
以下是代码:
int main(int argc, char *argv[]) {
int numtasks, rank, tag = 1;
char inmsg, outmsg = 'x';
MPI_Status stat;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
if ( rank == 0 ) {
MPI_Send(&outmsg, 1, MPI_CHAR, 1, tag, MPI_COMM_WORLD);
}
else if ( rank == 1 ) {
MPI_Recv(&inmsg, 1, MPI_CHAR, 0, tag, MPI_COMM_WORLD, &stat);
}
MPI_Finalize();
}
此外,还有一些重要的注意事项:
任何帮助将不胜感激。谢谢!
答案 0 :(得分:0)
我找到了解决问题的方法:
我正在使用MPICH并使用 mpirun 运行我的程序。从看起来的问题来看,mpich正在使用错误的网络接口。每个节点都有两个接口: lo 和 ens4 。根据我在其他帖子中看到的,似乎 lo 用于将数据从一个节点传输到自身,而 ens4 用于与其他节点通信。我使用以下ping命令验证了这一点:
$ ifconfig -a
:显示可用的界面; $ ping -I lo mpi-test-130b
- >失败$ ping -I ens4 mpi-test-130b
- > SUCCESS $ ping -I lo mpi-test-uaiw
- > SUCCESS $ ping -I ens4 mpi-test-uaiw
- >失败其中一种可能的解决方案是使用 mpirun --mca btl_tcp_if_include ens4 来确保mpirun使用ens4接口与其他节点进行通信。但这对我没有用,因为MPICH不能识别 - mca 参数。因此,我做了以下事情:
$ sudo apt-get remove libcr-dev mpich mpich-doc
; $ sudo apt install openmpi-bin openmpi-doc libopenmpi-dev
; 通过安装OpenMPI,我的代码工作正常。希望它可以帮助任何面临同样问题的人!