2010-03-22 79 views
3

尝试运行boost::mpi tutorial中的第一个示例时,我无法在两台以上的计算机上运行。具体而言,这似乎运行正常:无法在两台以上的计算机上运行OpenMPI

mpirun -hostfile hostnames -np 4 boost1 

与主机名的每个主机名<node_name> slots=2 max_slots=2。但是,当我将进程数量增加到5时,它就会挂起。当我超过2台机器时,我已将slots/max_slots的数目减少为1,结果相同。在节点上,这表明了在任务列表:

<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 

的集群建立与mpiboost库访问在NFS挂载的驱动器上。我是否遇到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的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; 
} 

它在具有多个进程的单台机器上运行良好,包括进入任何节点并运行。每个计算节点与通过NFS从远程计算机安装的工作目录和mpi/boost目录完全相同。当从文件服务器运行boost程序时(与boost/mpi以外的节点相同)是本地的),我可以在两个远程节点上运行。对于“世界你好”,但是,运行命令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的”打印和它挂在末尾。但是,从远程节点上的计算节点运行时的行为不同。

从节点2运行时,“Hello world”和升压代码都挂起mpirun -H node1 -np 12 ./hello,反之亦然。 (挂起的意思与上面相同:ort正在远程计算机上运行,​​但未通信回传。)

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

回答

5

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

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

2

我的第一个建议是简化:

  • 你可以建立标准MPI“你好,世界”的例子吗?
  • 你可以在localhost上多次运行它吗?
  • 你可以在另一台主机上通过ssh
  • 的路径是相同

如果是这样执行的话

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

宜游跨越。一旦将这些基础知识整理出来,请尝试Boost教程...并确保在您计划运行的所有主机上都有Boost和MPI库。

+0

@Dirk:感谢您的建议。我已经用这些观察结果更新了我的问题。 – rcollyer 2010-03-23 14:35:48

2

考虑使用参数--mca btl_tcp_if_include eth0使节点只使用eth0接口并阻止OpenMPI找出哪个网络是最好的。还有--mca btl_tcp_if_exclude eth0请记住代替eth0为您的特定界面。

我的/ etc/hosts中包含这样的诗句:

10.1.2.13 node13

...

10.1.3.13 node13-IB

当我推出的mpirun的TCP网络被选中并且节点使用TCP网络,但是在一段时间(20秒)之后,OpenMPI发现了IP 10.1.3.XXX并试图使用它们,这导致了错误消息。

我希望它能帮助

相关问题