5 均一多数回試行の割り振りによる並列処理

では、実際に簡単な並列処理をしてみる。一番簡単なのは

  • niter回の繰り返し処理を
  • nslave個のslavesに

割り振ることだろう

  • Rmpi,snowを読み込む
> library(Rmpi)
> library(snow)
  • 繰り返し処理としては、単純なものとして、2値(arg1,arg2)をとって、その入力2数とその和(sum)を返す関数を定める
  • 繰り返し処理の何番目なのか(iter)、何番目のslaveに割り振られたのか(slave)も出力させることとする
> shori<-function(iter,slave,arg1,arg2){sum<-arg1+arg2;return(list(iteration=iter,slave=slave,arg1=arg1,arg2=arg2,sum=sum))}
  • 繰り返し処理回数 niterを定める
> niter<-100
  • slave数を定める
> nslave<-25
  • 100試行分のarg1を定める
> arg1<-c(1:100);
  • 100試行分のarg2を定める
> arg2<-c(rep(1:5,20))
  • nslave個のslaveを発生させる
> cl<-makeCluster(nslave,type="MPI")
  • 出力格納用のarrayを作る。niter行で各行5数値(iteration,slave,arg1,arg2,sum)を格納するので
> result<-array(NA,c(5))
  • niteration回のループを回し、順繰りに1:nslaveのslaveに処理を割り当て、resultに出力を格納させる
> for(i in 1:niter){
j<-i%%nslave+1
result[i]<-clusterCall(cl[j],shori,i,j,arg1[i],arg2[i])
}
  • slaveを落とす
> stopCluster(cl)