3

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

mpirun -hostfile hostnames -np 4 boost1

主机名中的每个主机名都为<node_name> slots=2 max_slots=2. 但是,当我将进程数增加到 5 时,它就会挂起。当我超过 2 台机器时,我将slots/的数量减少到 1,结果相同。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

集群设置为在 NFS 安装的驱动器上可访问的mpi和库。boost我是否遇到了 NFS 的死锁?或者,还有其他事情发生吗?

更新: 需要明确的是,我正在运行的提升程序是

#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 的建议,我编译并运行了 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;
}

它在具有多个进程的单台机器上运行良好,这包括进入任何节点并运行。每个计算节点都与通过 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's”都被打印出来并挂在最后。但是,从远程节点上的计算节点运行时的行为不同。

当从 node2 运行时,“Hello world”和 boost 代码都会挂起,mpirun -H node1 -np 12 ./hello反之亦然。(挂起与上述相同的意义:orted 正在远程机器上运行,但没有回通信。)

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

4

3 回答 3

5

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

编辑:应该指出,文件服务器的防火墙允许任意连接,这就是为什么在其上运行的 mpi 程序的行为与仅在计算节点上运行的行为不同的原因。

于 2010-04-06T17:21:49.957 回答
2

考虑使用参数--mca btl_tcp_if_include eth0 使节点仅使用 eth0 接口并阻止 OpenMPI 找出哪个是最佳网络。还有--mca btl_tcp_if_exclude eth0 记得用eth0代替你的特定接口。

我的 /etc/hosts 包含这样的行:

10.1.2.13 节点13

...

10.1.3.13 node13-ib

当我启动 mpirun 时,选择了 TCP 网络并且节点使用了 TCP 网络,但是,过了一段时间(20 秒),OpenMPI 发现了 IP 10.1.3.XXX 并尝试使用它们,这导致了错误消息。

我希望它有帮助

于 2013-03-05T13:44:34.280 回答
2

我的第一个建议是简化:

  • 你能建立标准的 MPI 'hello, world' 例子吗?
  • 你能在本地主机上运行几次吗?
  • 你可以通过在另一台主机上执行吗ssh
  • 路径是否相同

如果是这样,那么

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

应该穿越。整理好这些基础知识后,请尝试 Boost 教程……并确保在计划运行的所有主机上都有 Boost 和 MPI 库。

于 2010-03-22T19:57:09.760 回答