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。コードの書き方間違ったかなあ。