2014-11-23 141 views
1

我遵循这里的指令“http://math.acadiau.ca/ACMMaC/Rmpi/sample.html”。这里是我的R代码里面Rmpi​​不能在节点间产生进程

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”,但它没有给出从属进程错误。

+0

-np将保持为1.当应用程序正常工作时,R应该从hostfile中获取自动传递给它的插槽数。 – russellpierce 2015-03-04 22:01:52

回答

0

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

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