代码之家  ›  专栏  ›  技术社区  ›  rcollyer

无法在两台以上的计算机上运行OpenMPI

  •  3
  • rcollyer  · 技术社区  · 16 年前

    尝试运行中的第一个示例时, boost::mpi tutorial ,我无法跨越两台以上的机器。具体来说,这似乎很好:

    mpirun -hostfile hostnames -np 4 boost1
    

    主机名中的每个主机名为 <node_name> slots=2 max_slots=2 . 但是,当我将进程数增加到5时,它就挂起了。我减少了 slots / max_slots 当我超过两台机器时,结果相同。在节点上,这显示在作业列表中:

    <user> Ss orted --daemonize -mca ess env -mca orte_ess_jobid 388497408 \
    -mca orte_ess_vpid 2 -mca orte_ess_num_procs 3 -hnp-uri \
    388497408.0;tcp://<node_ip>:48823
    

    此外,当我杀死它时,我会收到以下信息:

    node2- daemon did not report back when launched
    node3- daemon did not report back when launched
    

    集群是用 mpi boost 在安装了NFS的驱动器上可以访问libs。我是否在使用NFS时陷入死锁?或者,还有别的事情吗?

    更新: 明确地说,我正在运行的Boost程序是

    #include <boost/mpi/environment.hpp>
    #include <boost/mpi/communicator.hpp>
    #include <iostream>
    namespace mpi = boost::mpi;
    
    int main(int argc, char* argv[]) 
    {
      mpi::environment env(argc, argv);
      mpi::communicator world;
      std::cout << "I am process " << world.rank() << " of " << world.size()
            << "." << std::endl;
      return 0;
    }
    

    来自@dirk eddelbuettel's recommendations ,我编译并运行了MPI示例 hello_c.c ,如下

    #include <stdio.h>
    #include "mpi.h"
    
    int main(int argc, char* argv[])
    {
        int rank, size;
    
        MPI_Init(&argc, &argv);
        MPI_Comm_rank(MPI_COMM_WORLD, &rank);
        MPI_Comm_size(MPI_COMM_WORLD, &size);
        printf("Hello, world, I am %d of %d\n", rank, size);
        MPI_Barrier(MPI_COMM_WORLD);
        MPI_Finalize();
    
       return 0;
    }
    

    它在一台具有多个进程的机器上运行良好,这包括到任何节点的ssh和运行。每个计算节点都与通过NFS从远程计算机安装的工作目录和MPI/Boost目录相同。从文件服务器运行boost程序时(除了boost/mpi是本地节点外,与节点相同),我可以在两个远程节点上运行。但是,对于“hello world”,运行命令 mpirun -H node1,node2 -np 12 ./hello 我得到

    [<node name>][[2771,1],<process #>] \
    [btl_tcp_endpoint.c:638:mca_btl_tcp_endpoint_complete_connect] \
    connect() to <node-ip> failed: No route to host (113)
    

    当所有的“你好世界”都被打印出来并且挂在最后。但是,从远程节点上的计算节点运行时的行为不同。

    “Hello World”和“Boost code”都能用 mpirun -H node1 -np 12 ./hello 从节点2运行时,反之亦然。(与上面的意义相同:orted在远程机器上运行,但不进行通信。)

    这种行为不同于在文件服务器上运行的MPI-libs是本地的,而在计算节点上运行的这一事实表明,我可能遇到了一个NFS死锁。这是一个合理的结论吗?假设是这样,我如何配置MPI以允许我静态链接它?另外,我不知道如何处理从文件服务器运行时遇到的错误,有什么想法吗?

    3 回复  |  直到 13 年前
        1
  •  5
  •   rcollyer    16 年前

    答案很简单:打开通过ssh认证的MPI,然后打开节点之间的TCP/IP套接字。计算节点上的防火墙设置为只接受彼此的ssh连接,而不是任意连接。所以,在更新了iptables之后,hello world像冠军一样在所有节点上运行。

    编辑: 应该指出的是,文件服务器的防火墙允许任意连接,所以MPI程序在其上运行的行为与在计算节点上运行的行为不同。

        2
  •  2
  •   Dirk is no longer here    16 年前

    我的第一个建议是简化:

    • 你能建立一个标准的MPI“你好,世界”的例子吗?
    • 你能在本地主机上运行几次吗?
    • 你能在另一台主机上通过 ssh
    • 路径相同吗

    如果是这样,那么

    mpirun -H host1,host2,host3 -n 12 ./helloworld
    

    应该穿过。一旦你把这些基础知识整理好,就可以尝试一下Boost教程…并确保在计划运行的所有主机上都有Boost和MPI库。

        3
  •  2
  •   SaleriS    13 年前

    考虑使用参数 --mca btl_tcp_如果_包括eth0 要使节点只使用eth0接口并阻止openmpi来确定哪个是最好的网络。也有 --mca btl_tcp_如果排除eth0 记住字幕 种族歧视 对于您的特定界面。

    我的/etc/主机包含如下行:

    10.1.2.13节点13

    10.1.3.13节点13 Ib

    当我启动mpirun时,选择了tcp网络,节点使用tcp网络,但是经过一段时间(20秒),openmpi发现了ips 10.1.3.xxx并尝试使用它们,导致了错误消息。

    希望有帮助

    推荐文章