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)