尝试在boost::mpi tutorial中运行第一个示例时,我无法运行两台以上的计算机.具体来说,这似乎运行良好:
mpirun -hostfile hostnames -np 4 boost1
将主机名中的每个主机名称为< node_name> slots = 2 max_slots = 2.但是,当我将进程数增加到5时,它就会挂起.当我超过2台机器时,我将slot / 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
设置集群时,可以在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的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;
}
它在具有多个进程的单个机器上运行良好,这包括sshing到任何节点并运行.每个计算节点与通过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挂起,反之亦然. (挂起与上面相同的意思:ort正在远程计算机上运行,但没有回传.)
行为不同于在mpi库本地的文件服务器上运行而不是在计算节点上运行这一事实表明我可能遇到了NFS死锁.这是一个合理的结论吗?假设是这种情况,我如何配置mpi以允许我静态链接它?另外,我不知道从文件服务器运行时我得到的错误是什么,有什么想法吗?
解决方法:
答案结果很简单:打开mpi通过ssh进行身份验证,然后在节点之间打开tcp / ip套接字.计算节点上的防火墙设置为仅接受来自彼此的ssh连接,而不是任意连接.因此,在更新iptables之后,hello world就像所有节点中的冠军一样运行.
编辑:应该指出文件服务器的防火墙允许任意连接,这就是为什么在其上运行mpi程序的行为与仅在计算节点上运行的行为不同.