MPI_Send在执行不同节点时卡住

时间:2016-11-27 12:21:49

标签: ssh mpi google-compute-engine send recvmmsg

我有一个非常简单的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();
}

此外,还有一些重要的注意事项:

  1. 我在Google Compute Engine中使用了2台虚拟机集群: mpi-test-uaiw mpi-test-130b ;
  2. 我已经在两个虚拟机之间配置了无密码 ssh ,即来自 mpi-test-uaiw 我只需输入 ssh mpi-test- 130b ,它工作正常(相反也有效);
  3. 简单的" Hello World"使用MPI可以使用此群集,但它不包含任何发送或接收操作;
  4. 防火墙已停用。
  5. 任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法:

我正在使用MPICH并使用 mpirun 运行我的程序。从看起来的问题来看,mpich正在使用错误的网络接口。每个节点都有两个接口: lo ens4 。根据我在其他帖子中看到的,似乎 lo 用于将数据从一个节点传输到自身,而 ens4 用于与其他节点通信。我使用以下ping命令验证了这一点:

  • $ ifconfig -a :显示可用的界面;
  • 来自mpi-test-uaiw: $ ping -I lo mpi-test-130b - >失败
  • 来自mpi-test-uaiw: $ ping -I ens4 mpi-test-130b - > SUCCESS
  • 来自mpi-test-uaiw: $ ping -I lo mpi-test-uaiw - > SUCCESS
  • 来自mpi-test-uaiw: $ ping -I ens4 mpi-test-uaiw - >失败

其中一种可能的解决方案是使用 mpirun --mca btl_tcp_if_include ens4 来确保mpirun使用ens4接口与其他节点进行通信。但这对我没有用,因为MPICH不能识别 - mca 参数。因此,我做了以下事情:

  1. 删除了我用来安装MPICH的软件包(在两个节点中): $ sudo apt-get remove libcr-dev mpich mpich-doc ;
  2. 安装了OpenMPI(在两个节点中): $ sudo apt install openmpi-bin openmpi-doc libopenmpi-dev ;
  3. 通过安装OpenMPI,我的代码工作正常。希望它可以帮助任何面临同样问题的人!