UNIX環境でのRの並列化


Download

(すべて,ベータ版ですので,ご了承願います.)


mpi.so (Linux用,Red Hat 6.2, GCC-2.91.66 でビルトしました.GZIP形式)

mpi.c (mpi.soのソース)

mpi.R (RでのMPI関数の定義)

mpi.txt (mpi.Rで定義された関数の説明)

mpiapp.R (便利な関数等)


動作に必要なもの

  1. R (テストには1.2.0を使いました.)
  2. MPICH

TIPS:

  1. 以下の例はLINUXの場合です.
  2. あるDirectoryをすべてのノードで共有できるようにNFS等で設定が必要です.
  3. Rの起動時にmpi.soのロードと,RMPIinitを実行するように設定する必要があります.

    $R_HOME/library/base/R/Rprofile に以下の部分を追加して下さい.


    load(".RData",globalenv())
    dyn.load("/home/sato/mpi/mpi.so") #実際にはmpi.soがあるパスを書く.
    .nnnn1 <- 0
    .nnnn2 <- 0
    .zrtmp <- .C("RMPIinit",as.integer(.nnnn1),as.integer(.nnnn2))
    quit <- function(save="default",status = 0, runLast=TRUE)
    {
    if(!is.null(options()$MPIid)) {
    if(options()$MPIid != 0) {
    save <- "no"}
    else save <- "yes"
    }
    .Internal(quit(save,status,runLast))
    }
    q <- quit
    options(MPInum=.zrtmp[[1]])
    options(MPIid=.zrtmp[[2]])
    options(MPIworld=99)
    source("run.R")
    .C("RMPIfinalize")
    q()


    これで,計算プログラムをrun.Rに書けば,実行されることになります.

    本来ですと、load(".RData",globalenv()) はいらないような気がしますが,これが無いと,.RDataが読まれません.

  4. 実際の起動は run.RがあるDirectory(もちろん,各ノードで共通でなければなりません.)で

    > mpirun -np 3 /home/sato/bin/Rexec

    とすればOKです.


    さらに上のRexecの内容は $R_HOME/bin/R を書き換えて,実際に実行するところを

    exec ${R_HOME}/bin/${R_binary} --save --slave --restore --vsize 100M --nsize 2000k

    というようにして有ります.(最後の方です.)

  5. 問題となりそうな点は起動のさせ方と,終わり方にあります.終わり方ですが,現在はq()を書き換えて,ノード0ではsaveして,その他のノードではsaveしないようにしてあります.起動のさせ方はOSによって変わってくる可能性がありますので、工夫してみてください。私のほうで実行できた例は、LINUX以外はSGI2800、IBMのSP2、日立のSR8000です。(日立はRのソースをいじる必要があります。)

不明な点がありましたら,メールください.