1

如何使用 MPI_Comm_spawn 在远程节点上启动工作进程?

使用 OpenMPI 1.4.3,我试过这段代码:

MPI_Info info;
MPI_Info_create(&info);
MPI_Info_set(info, "host", "node2");
MPI_Comm intercom;
MPI_Comm_spawn("worker",
        MPI_ARGV_NULL,
        nprocs,
        info,
        0,
        MPI_COMM_SELF,
        &intercom,
        MPI_ERRCODES_IGNORE);

但这会失败并显示此错误消息:

-------------------------------------------------- ----------------------
没有为应用程序分配资源
  工人
匹配请求的映射:


验证您是否已使用
--host 或 --hostfile 规范。
-------------------------------------------------- ----------------------
-------------------------------------------------- ----------------------
一个守护进程(pid 未知)在尝试执行信号 1 时意外死亡
启动所以我们正在中止。

环境可能会报告更多信息(见上文)。

这可能是因为守护进程无法找到所有需要的共享
远程节点上的库。您可以将 LD_LIBRARY_PATH 设置为
远程节点上共享库的位置,这将
自动转发到远程节点。
-------------------------------------------------- ----------------------

如果我用本地机器的名称替换“node2”,那么它工作正常。如果我 ssh 进入 node2 并在那里运行相同的东西(在信息字典中使用“node2”),那么它也可以正常工作。

我不想用 mpirun 启动父进程,所以我只是在寻找一种在远程节点上动态生成进程的方法。这可能吗?

4

1 回答 1

2

我不想用 mpirun 启动父进程,所以我只是在寻找一种在远程节点上动态生成进程的方法。这可能吗?

我不确定你为什么不想用 mpirun 启动它?无论如何,只要你点击 MPI_Init(),你就会隐式地启动整个 MPI 机器,这样你就可以传递它的选项而不是依赖默认值。

这里的问题很简单,当 MPI 库启动时(在 MPI_Init())它看不到任何其他可用的主机,因为您没有使用 --host 或 --hostfile 选项给它任何 mpirun。它不会只是在你的 say-so 上的其他地方启动进程(事实上,spawn 不需要 Info 主机,所以一般来说它甚至不知道去哪里),所以它失败了。

所以你需要做 mpirun --host myhost,host2 -np 1 ./parentjob ,或者更一般地说,提供一个主机文件,最好有一些可用的插槽

myhost slots=1
host2 slots=8
host3 slots=8

并以这种方式启动作业,mpirun --hostfile mpihosts.txt -np 1 ./parentjob这是一项功能,而不是错误;现在,MPI 的工作是找出工人去哪里,如果你没有在信息中明确指定主机,它会尝试把它放在最未充分利用的地方。这也意味着您不必重新编译来更改您将生成的主机。

于 2010-11-23T23:05:52.350 回答