远程节点上的mpi_comm_spawn

远程节点上的mpi_comm_spawn,mpi,openmpi,Mpi,Openmpi,如何使用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_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);
但此操作失败,并显示以下错误消息:

-------------------------------------------------------------------------- There are no allocated resources for the application worker that match the requested mapping: Verify that you have mapped the allocated resources properly using the --host or --hostfile specification. -------------------------------------------------------------------------- -------------------------------------------------------------------------- A daemon (pid unknown) died unexpectedly on signal 1 while attempting to launch so we are aborting. There may be more information reported by the environment (see above). This may be because the daemon was unable to find all the needed shared libraries on the remote node. You may set your LD_LIBRARY_PATH to have the location of the shared libraries on the remote nodes and this will automatically be forwarded to the remote nodes. -------------------------------------------------------------------------- -------------------------------------------------------------------------- 没有为应用程序分配资源 工人 与请求的映射匹配的: 验证是否已使用正确映射分配的资源 --主机或--hostfile规范。 -------------------------------------------------------------------------- -------------------------------------------------------------------------- 守护进程(pid未知)在尝试运行时在信号1上意外死亡 发射,所以我们正在中止。 环境可能会报告更多信息(见上文)。 这可能是因为守护进程无法找到所有需要的共享资源 远程节点上的库。您可以将LD_LIBRARY_路径设置为 共享库在远程节点上的位置,这将 自动转发到远程节点。 -------------------------------------------------------------------------- 如果我用本地机器的名称替换“node2”,那么它工作正常。如果我ssh到node2并在那里运行相同的东西(在信息字典中使用“node2”),那么它也可以正常工作

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

我不想开始做父母 用mpirun处理,所以我只是 寻找一种动态繁殖的方法 远程节点上的进程。这是吗 可能吗

我不知道你为什么不想从mpirun开始?只要点击MPI_Init(),您就会隐式启动整个MPI机器,这样您就可以传递选项,而不是依赖默认值

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

所以你需要这样做
mpirun——主机myhost,主机2-np 1./parentjob
或者,更一般地说,提供一个主机文件,最好具有多个可用插槽

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

并以这种方式启动作业,
mpirun--hostfile mpihosts.txt-np 1./parentjob
这是一个特性,而不是一个bug;现在,MPI的任务是确定工作人员的去向,如果您没有在信息中明确指定主机,它将尝试将其放置在最未充分利用的位置。这也意味着您无需重新编译即可更改将要生成的主机。

谢谢。我想要避免mpirun的原因是,我正在编写一个MATLAB mex文件,该文件可以卸载一些计算。所以我只有一个MATLAB为我调用的C文件,这意味着主机名需要以编程方式指定。我想这意味着我必须以某种方式从我的mex文件在新进程中调用mpirun?啊,是的。如果允许的话,您可以让mex文件调用系统(“mpirun..”),甚至让它调用调用mpirun的bash脚本。。。我可以看到你想要避免这些多层的地方。我刚刚尝试的另一件似乎与OpenMPI一起工作的事情是:
int fakeargc=6;char**fakeargv={“mpirun”、“--hostfile”、“mpihosts.txt”、“-np”、“1”、“/parentjob”};MPI_Init(&fakeargc,&fakeargv)。我无法想象这是推荐的,或者甚至可以与其他MPI可靠地工作。看起来需要额外的图层。你的技巧对我来说是可以接受的,但不幸的是在这里不起作用(顺便说一下,必须将其定义为char*fakeargv[],然后转换为char***)。我在openmpi和mpich2文档中做了更多的挖掘,现在看来它们都不支持在远程notes上生成进程,除非通过mpirun/mpiexec调用。