Rmpi无法跨节点生成进程

时间:2014-11-23 12:21:21

标签: openmpi

我按照“http://math.acadiau.ca/ACMMaC/Rmpi/sample.html”的说明进行操作。这是我的R代码

library("Rmpi")
mpi.spawn.Rslaves()
.Last <- function(){
if (is.loaded("mpi_initialize")){
    if (mpi.comm.size(1) > 0){
        print("Please use mpi.close.Rslaves() to close slaves.")
        mpi.close.Rslaves()
    }
    print("Please use mpi.quit() to quit R")
    .Call("mpi_finalize")
    }
}
mpi.remote.exec(paste("I am",mpi.comm.rank(),"of",mpi.comm.size()-1,"on",mpi.get.processor.name()))
mpi.close.Rslaves()
mpi.quit()

在脚本中我指定了进程号:

#$ -S /bin/sh
#$ -pe orte 20
#$ -cwd
#$ -V
#$ -o /data1/users/liuyang/R/rmpi.o
#$ -e /data1/users/liuyang/R/rmpi.e
mpiexec -np 1 R --slave CMD BATCH rmpi.R

但我发现R代码只在主节点上运行,而mpi.spawn.Rslaves()只产生12个进程(主节点的cpu核心号)。

集群是sge集群,我使用openmpi 1.4.3版安装了Rmpi软件包。那是什么原因?

我还尝试在R代码中注释mpi.spawn.Rslaves()行并将mpiexec的参数更改为“-np $ NSLOTS”,但它没有给出从属进程错误。

1 个答案:

答案 0 :(得分:0)

你需要在你的R脚本中保存mpi.spawn.Rslaves()然后用mpiexec / mpirun运行你的R脚本“-machinefile”和“-np 1”(http://linux.die.net/man/1/mpirun)或运行你的R批处理调度程序(如SGE,OpenLava等)的脚本。

基本上,RMPI调用MPI_Comm_spawn()的MPI API来生成工作节点。 MPI_Comm_spawn()的API从MPI上下文获取大小和机器列表。如果在没有mpiexec / mpirun的情况下执行RMPI脚本,则它是Singleton MPI_INIT模式,它在MPI上下文中具有主机的最大ncores。如果使用mpiexec / mpirun执行RMPI脚本,则mpiexec / mpirun将使用机器列表准备MPI上下文。在上面的情况中,MPI上下文具有在machinefile中指定的机器和插槽。 “-np 1”表示只创建一个R脚本的实例,即MPI master。