【问题标题】:mpi_comm_spawn on remote nodes远程节点上的 mpi_comm_spawn
【发布时间】:2011-05-14 18:49:41
【问题描述】:

如何使用 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 启动父进程,所以我只是在寻找一种在远程节点上动态生成进程的方法。这可能吗?

【问题讨论】:

    标签: mpi openmpi


    【解决方案1】:

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

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

    这里的问题很简单,当 MPI 库启动时(在 MPI_Init())它看不到任何其他可用的主机,因为你没有给它任何 --host 或 --hostfile 选项米皮伦。它不会只是在你的 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 的工作是找出工人去哪里,如果你没有在信息中明确指定主机,它会尝试把它放在最未充分利用的地方。这也意味着您不必重新编译来更改您将生成的主机。

    【讨论】:

    • 谢谢。我想避免使用 mpirun 的原因是我正在编写一个 MATLAB mex 文件来卸载一些计算。所以我只有一个 MATLAB 为我调用的 C 文件,这意味着需要以编程方式指定主机名。我想这意味着我必须以某种方式从我的 mex 文件中在新进程中调用 mpirun?
    • 啊,是的。如果允许的话,您总是可以只使用 mex 文件调用系统(“mpirun..”),或者甚至让它调用调用 mpirun 的 bash 脚本......我可以看到你想在哪里避免这些多层。我刚刚尝试过的另一件事似乎与 OpenMPI 一起工作——但太可怕了,我很惭愧在 SO 上将我的名字与它相关联——如下:int fakeargc = 6; char **fakeargv = {"mpirun", "--hostfile","mpihosts.txt","-np","1","./parentjob"}; MPI_Init(&fakeargc, &fakeargv);。我无法想象这是推荐的,甚至可以与其他 MPI 一起可靠地工作。
    • 哦,好吧。看起来额外的层是必要的。你的把戏对我来说是可以接受的,但不幸的是在这里没有奏效(顺便把它定义为 char* fakeargv[],然后转换为 char***)。我对 openmpi 和 mpich2 文档进行了更多挖掘,看起来此时它们都不支持在远程笔记上生成进程,除非通过 mpirun/mpiexec 调用。
    猜你喜欢
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多