Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法在两台以上的计算机上运行OpenMPI_C++_Openmpi_Boost Mpi - Fatal编程技术网

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

C++ 无法在两台以上的计算机上运行OpenMPI,c++,openmpi,boost-mpi,C++,Openmpi,Boost Mpi,在尝试运行中的第一个示例时,我无法运行两台以上的计算机。具体而言,这似乎运行良好: mpirun -hostfile hostnames -np 4 boost1 主机名中的每个主机名为slots=2 max\u slots=2。但是,当我将进程数增加到5时,它只是挂起。我已将插槽数/最大插槽数减少到1,当我超过2台机器时,结果相同。在节点上,这将显示在作业列表中: <user> Ss orted --daemonize -mca ess env -mca orte_ess_job

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

mpirun -hostfile hostnames -np 4 boost1
主机名中的每个主机名为
slots=2 max\u slots=2
。但是,当我将进程数增加到5时,它只是挂起。我已将
插槽数
/
最大插槽数
减少到1,当我超过2台机器时,结果相同。在节点上,这将显示在作业列表中:

<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
群集设置为可在NFS安装的驱动器上访问的
mpi
boost
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;
}
它在具有多个进程的单台计算机上运行良好,这包括对任何节点进行sshing并运行。每个计算节点都与通过NFS从远程机器装载的工作目录和mpi/boost目录相同。从文件服务器运行boost程序时(与节点相同,boost/mpi是本地的除外),我能够在两个远程节点上运行。但是,对于“hello world”,运行命令mpirun-H node1,node2-np 12./helloI get

[<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)
[[2771,1],]\
[btl\U tcp\U端点。c:638:mca\U btl\U tcp\U端点\U完成\U连接]\
连接()失败:没有到主机的路由(113)
而所有的“Hello World”都被打印出来并挂在最后。但是,从远程节点上的计算节点运行时的行为有所不同

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


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

我的第一个建议是简化:

  • 您能否构建标准MPI“hello,world”示例
  • 你能在本地主机上运行几次吗
  • 您可以通过ssh在另一台主机上执行吗
  • 路径相同吗
如果是,那么

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

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

答案很简单:通过ssh打开经过身份验证的MPI,然后打开节点之间的tcp/ip套接字。计算节点上的防火墙设置为只接受彼此的ssh连接,而不是任意连接。因此,在更新iptables之后,helloworld在所有节点上都像champ一样运行


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

考虑使用参数--mca btl_tcp_(如果包含eth0)使节点仅使用eth0接口,并阻止OpenMPI确定哪一个是最佳网络。如果排除eth0请记住为您的特定接口替换eth0

My/etc/hosts包含如下行:

10.1.2.13节点13

10.1.3.13节点13 ib

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


我希望能有所帮助

@Dirk:谢谢你的建议。我用这些观察结果更新了我的问题。
[<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)
mpirun -H host1,host2,host3 -n 12 ./helloworld