2014-11-23 137 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腳本實例。