在尝试运行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 以允许我静态链接它?此外,我不知道如何处理从文件服务器运行时遇到的错误,有什么想法吗?