MPI使ってforeachとdoSNOWで並列処理させたらかえって遅くなった件
makeClusterでクラスターを立ち上げる際に、typeとしてSOCK以外にもMPIやPVMを選べる。
今回はMPIを使って速度を比較してみる。
ちなみにMPIについてはこちらを参照。
http://www.cs.hiroshima-u.ac.jp/~yasuaki/dokuwiki/doku.php?id=mpi:mpi
MPIで試してみる理由は、今のマシンにOpenMPIがなぜか入っていて色々手間がかからないというもの。なのでマシンに入っていないPVMはまた今度。
以下コード例。
並列処理を行わない場合とSOCKの場合とMPIの場合の3パターンで比較している。
> library(foreach) > set.seed(1) > #並列処理をしない場合 > N <- 10^4 > system.time(foreach(i = 1:N,.combine = "cbind") %do% { + sum(rnorm(N)) + }) ユーザ システム 経過 20.837 1.252 71.102 > > #foreach+doSNOW(SOCK)で並列処理 > library(doSNOW) > cl_sock <- makeCluster(2, type="SOCK") > registerDoSNOW(cl_sock) > system.time(foreach(i = 1:N,.combine = "cbind") %dopar% { + sum(rnorm(N)) + }) ユーザ システム 経過 10.340 0.927 70.568 > stopCluster(cl_sock) > > #foreach+doSNOW(MPI)で並列処理 > library(Rmpi) > cl_mpi <- makeCluster(2, type="MPI") 2 slaves are spawned successfully. 0 failed. > registerDoSNOW(cl_mpi) > getDoParWorkers() [1] 2 > system.time(foreach(i = 1:N,.combine = "cbind") %dopar% { + sum(rnorm(N)) + }) ユーザ システム 経過 44.563 26.185 259.408 > > stopCluster(cl_mpi) [1] 1
うん、遅い。遅すぎるよMPI。コードの書き方間違ったかなあ。