必要に迫られ、計算機クラスタで計算をせざるを得なくなりました。
幸い私は東工大の誇るグリッドスパコンTSUBAME(現時点で公称アジア最速)を自由に使える(但し現在1ジョブあたり16ノードの制限)恵まれた立場にありますが、ただRを実行しても一台分しか使わないので、却って自分のパソコンよりも遅い(笑)。(追加註:TSUBAMEは32GBもしくは64GBのメモリを使えるため巨大なオブジェクトを扱う計算はさすがに早い。) 並列処理用にRのコードを書くのは面倒そうなので、これまで宝の持ち腐れ状態でしたが、最近snowパッケージを使うと、面倒無しにRで並列計算ができることを知り、やっと使ってみる気になりました。
ということで、勉強がてら作者Luke Tierney氏のウェブサイトにある解説文と、snowパッケージのヘルプ文章を以下に翻訳したものを紹介します。 snowパッケージは「完全に並列処理可能な複数計算(つまり一つの計算結果が他の計算結果を前提にしない)」を自動的にクラスタ内のワーカ(スレーブ)計算機に割り当て処理し、結果をマスタ計算機に集約できるようです。 具体的には apply() 関数の並列処理版関数を使うだけです。最終的には見近に転がっている遊休パソコンをつないでクラスタを作れば(このやりかたがよくわからない -> 求むノウハウ)、皆さんも手軽にクラスタ計算のメリットを享受できるのでは、と考えています。
Luke Tierney,
Department of Statistics and Actuarial Science,
University of Iowa
snow (Simple Network of Workstations) パッケージは、Rで「明白に並列的な」計算実行するための、 ワークステーション集合もしくは Beowulf クラスタ使用に対する簡単なメカニズムを実装している。 部分的に Python CoW(Cluster of Workstations)パッケージ に 基づくインタフェイスは極めて単純であることを目指しており、数種類の異なった低水準コミュニケーション 機構のトップに実装できるようにデザインされている。3種類の低水準インタフェイスがこれまでに 実装されている。一つは Li と Rossini による rpvm パッケージ経由で PVM を使う。もう一つは Hao Yu による Rmpi パッケージ経由で MPI を 使う。今一つは raw ソケットを使うもので PVM や MPI が使えない場合に有益である。 このノートはクラスタの開始法、クラスタを用いた計算に対する基本関数、そして 並列ブートストラップ法に対してクラスタを用いる一つの例を紹介する。
二つの注意:
ワークステーションクラスタの開始は、基底にあるコミュニケーション機構に明示的に依存する クラスタを使用する際の唯一のステップである。 クラスタは makeCluster 関数を呼び出すと開始されるが、呼び出しの詳細は現在のところクラスタの タイプにより少々異なる。PVM と MPI クラスタはまた、PVM もしくは MPI システムを開始するために幾つかの 予備的準備的を必要とするかもしれない。
PVM (Parallel Virtual Machine) クラスタを開始するには、まず PVM を開始しなければならない。
私は、このためには、私は PVM コンソール pvm を使うのが好きだ:
<starting PVM using the pvm console>
luke@itasca cluster% pvm pvm> add itasca add itasca 0 successful HOST DTID itasca Duplicate host pvm> add owasso add owasso 1 successful HOST DTID owasso 80000 pvm> conf conf 2 hosts, 2 data formats HOST DTID ARCH SPEED DSIG itasca 40000 LINUX 1000 0x00408841 owasso 80000 DARWIN 1000 0x0658eb59 pvm>
conf 命令で示された並列仮想マシン構成は二つのホスト、 i386 Linux が動く itasca と Mac OS X が動く owasso からなる。コマンドラインコンソール pvm の代わりに、もしインストール されていればグラフィカルなコンソール xpvm を使っても良い。もしくは rpvm パッケージを使って、rpvm パッケージが提供する R 関数を使っても良い。
一旦 PVM が動き出せば、二つの作業ノードからなるクラスタを使うためには、
マスターでRを開始し、 snow パッケージをロードし、そして makeCluster
を二つの引数、作業ノード数と type = "PVM" で実行する。:
<starting a PVM cluster>
cl <- makeCluster(2, type = "PVM")
返り値はこれらの二つのプロセスへの参照からなるリストである。
もし rpvmパッケージが利用でき Rmpi がまだロードされていなければ、 現在の既定のクラスタタイプは "PVM" であり、従って type = "PVM" 引数は省略できる。
PVM を使った作業が終了したら、それをシャットダウンすることを忘れないこと。 例えば、pvm コンソールで halt 命令を実行する。
もし MPI 2 プロセスを生み出す(spawn) API をサポートしている LAM のような MPI システムを使っているのなら、ソケットや PVM クラスタと同様にして MPI クラスタを 生成できる。もしプロセス生成機能をサポートしない MPI システムを使っているなら、異なった手順が 必要になる。例えば lamboot を使い、最初に MPI を開始する必要があるかも知れない。 詳細は使用中の MPI システムに依存する。
MPI の利用が終ったらそれをシャットダウンする(もし使用中の MPI が必要とするならば)。 LAM-MPI に対しては例えば lamhalt を使う。
プロセス生成機能をサポートする MPI システムに対する MPI クラスタは次のように開始できる;
<starting an MPI cluster with process spawning>
cl <- makeCluster(2, type = "MPI")
もし rpvm が利用不可能だが Rmpi は利用できるなら、 現在の既定のクラスタタイプは "MPI" であり、引数 type = "MPI" は省略できる。
もし使用中の MPI システムがプロセス生成機能を持たないか、mpirun を使って MPI ジョブを
実行したいのなら、 Rmpi をインストールする必要があるだろう。
またインストールした snow パッケージか、パッケージのソースの inst
ディレクトリから RMPISNOW というシェルスクリプトを適当な位置(できればユーザから
アクセス可能なパス)にインストールしておく必要がある。
もし RMPISNOW がユーザのパス上にあれば、R を以下のように開始する:
<starting R with mpirun>
mpirun -np 3 RMPISNOW
これはマスターと二つのワーカプロセスを開始する。クラスタはマスタプロセス中に作られる。
このクラスタへの参照は次のようにして得られる:
<obtaining a cluster started with mpirun>
cl <- getMPIcluster()
最新版の snow では稼働中のクラスタへの参照はまた以下でも得られる:
obtaining a cluster started with mpirun>
cl <- makeCluster()
もしくは、二つのワーカをを持つクラスタに対しては次のようにしても良い:
<obtaining a cluster started with mpirun>
cl <- makeCluster(2)
ソケットクラスタを開始するには命令 makeCluster を使い、
type="SOCK" と使用する計算機のリストを指定する。例えば
<starting a socket cluster>
cl <- makeCluster(c("itasca", "owasso"), type = "SOCK")
二つの R プロセスからなるクラスタを開始する。一つは itasca という名前の計算機、今一つは owasso という計算機上にある. 返り値はこれら二つのプロセスへの参照である。
クラスタ生成関数 makeCluster には、ノードを生成プロセスに対するオプションを
指定する幾つかの追加的な名前付き引数を与えることができる。
最も有用な引数はクラスタタイプに対する type 引数、開始プロセスが、ワーカのホストがマスタと同一の
アーキテクチャとファイルシステムのレイアウトを持つと仮定して良いかを指定する
homogeneous 引数(異質的(heterogeneous)クラスタに付いては「異質的(inhomogeneous)システム」節
に解説がある)、
そしてワーカからの出力が出力先を指示する outfile である。
既定では、outfile は /dev/null である(つまり無視される)。
デバッグ時、特に初期設定の試行中、には出力を適当なファイルにリダイレクトすることが有益なことがある。
各クラスタ生成呼び出しに対する追加のクラスタオプションを指定する もう一つの方法が、setDefaultClusterOptions を使って既定動作を変更することである。 例えば、既定値が「異質的 MPI クラスタ」と指定するには次のようにする:
setDefaultClusterOptions(type="MPI", homogeneous = FALSE)
クラスタを停止するには次のようにすべきである:
<stopping a cluster>
stopCluster(cl)
ソケットクラスタはそれらを生成したプロセスが終了すると自動的に停止するが、 それでも stopCluster を呼び出すのが好ましい。 それが生成したプロセスが存在するより前に PVM クラスタを終了するのに stopCluster を使用する代わりに、PVM コンソールで halt 命令を 実行しても良い。使用している MPI システムは同様の機能を持っている可能性がある。 例えば、LAM システムに対しては lamhalt 命令や lamwipe 命令が存在する。
クラスタ生成時の既定オプション設定では、 R シェルスクリプトと snow ライブラリが全てのノードで同一の絶対パスにあるという同質的(homogeneous) システムを前提にしている。snow はシステムライブラリにインストールされている必要はないが、 既定の設定が有効であるためには、それがマスタに対する R_LIBS 環境変数中で指定された ライブラリのどれかに存在することが必要である。
異なったレイアウトのファイルシステムや、異なったアーキテクチャが同一のファイルシステムを共有するシステムを 持つような、異質的(inhomogeneous)システムでは幾つかの追加の設定が必要になる: ワーカプロセスを実行するのに使われる各計算機毎に、スクリプト RunSnowNode をインストールされた snow からその計算機の検索パス上の位置にコピーし、それが実行可能であることを確認する。 マスタ計算機とワーカプロセスを実行する各計算機で、環境変数 R_SNOW_LIB を snow パッケージや、rpvm, Rmpi もしくは 適切なアーキテクチャに対する rlecuyer といったサポートパッケージを含む ディレクトリの名前にする。 各計算機の検索パス上に適切なバージョンの R が利用可能であることを確認する。
現時点では、変数 R_SNOW_LIB を空でない値に設定すると、マスタは homogeneous クラスタオプションを FALSE とする。 さもなければ、それは TRUE とされる。
クラスタを使用するための基本的関数は clusterCall と
clusterApply である。clusterCall は指定された関数を
クラスタの各メンバ上で同一引数で呼び出し、結果をリストで返す。実行は
並列処理される。例えば、ノードにその名前と計算機タイプを問い合わせるには次のようにする:
<R session>
> clusterCall(cl, function() Sys.info()[c("nodename","machine")]) [[1]] nodename machine "owasso.stat.uiowa.edu" "Power Macintosh" [[2]] nodename machine "itasca" "i686"
有用な clusterCall の変種は clusterEvalQ で以下のように
定義される:
<definition of clusterEvalQ>
clusterEvalQ <- function(cl, expr) clusterCall(cl, eval, substitute(expr), env=.GlobalEnv)
これは例えば、各クラスタノードにあるパッケージをロードするのに使える:
<loading a library on all nodes>
clusterEvalQ(cl, library(boot))
clusterApply は lapply の変種で、クラスタの異なったメンバ上で各々の
呼び出しを実行する。クラスタのノード数はリスト引数中の要素数以上でなければならない。
簡単な例:
<R session>
> clusterApply(cl, 1:2, get("+"), 3) [[1]] [1] 4 [[2]] [1] 5
既定の乱数発生器は強い相関を持つ可能性が高い:
<R session>
> clusterCall(cl, runif, 3) [[1]] [1] 0.08496597 0.35232298 0.60300751 [[2]] [1] 0.08496597 0.35232298 0.60300751
これを回避する手軽な方法は乱数種であり、
次のようにする:
<random seeding of cluster generators>
clusterApply(cl, runif(length(cl),max=10000000), set.seed)
より良い方法は並列乱数発生器 パッケージを使うことである。そうしたものが幾つかある。
snow は既定では rlecuyer パッケージを使うが、これは [[L'Ecuyer, Simard, Chen, and Kelton:
http://www.iro.umontreal.ca/%7Elecuyer/myftp/papers/streams00.pdf]] の並列乱数発生パッケージへの
インタフェイスである。 関数 clusterSetupRNG は初期化を行う。追加引数無しで呼び出すと
ランダムな種を使う。ヘルプ頁で説明された名前付き引数を使えば初期値をコントロールできる:
<R session>
> clusterSetupRNG(cl) > clusterCall(cl, runif, 3) [[1]] [1] 0.749391854 0.007316102 0.152742874 [[2]] [1] 0.8424790 0.8896625 0.2256776
boot パッケージはデータ nuclear を使った例を含む。
boot のヘルプ頁に与えられた準備コードは次のようになる:
<bootstrap setup>
library(boot) # この例では nuclear データに基づく回帰予測で boot を使う。 # この例は Davison and Hinkley (1997) の例6.8 から取った。 # 統計量に対する2つの追加引数が boot 経由で渡されていることを注意。 data(nuclear) nuke <- nuclear[,c(1,2,5,7,8,10,11)] nuke.lm <- glm(log(cost)~date+log(cap)+ne+ ct+log(cum.n)+pt, data=nuke) nuke.diag <- glm.diag(nuke.lm) nuke.res <- nuke.diag$res*nuke.diag$sd nuke.res <- nuke.res-mean(nuke.res) # データ、標準化残さ、当てはめ値を持つ新しいデータフレームを # ブートストラップで使うために作る。 nuke.data <- data.frame(nuke,resid=nuke.res,fit=fitted(nuke.lm)) # 番号32のプラントの日付 73.00 での予測値を得たい。 new.data <- data.frame(cost=1, date=73.00, cap=886, ne=0, ct=0, cum.n=11, pt=1) new.fit <- predict(nuke.lm, new.data) nuke.fun <- function(dat, inds, i.pred, fit.pred, x.pred) { assign(".inds", inds, envir=.GlobalEnv) lm.b <- glm(fit+resid[.inds] ~date+log(cap)+ne+ct+ log(cum.n)+pt, data=dat) pred.b <- predict(lm.b,x.pred) remove(".inds", envir=.GlobalEnv) c(coef(lm.b), pred.b-(fit.pred+dat$resid[i.pred])) }
一つのワークステーションではブートストラップ例は
約30秒かかった。
<R session>
> system.time(nuke.boot <- + boot(nuke.data, nuke.fun, R=999, m=1, + fit.pred=new.fit, x.pred=new.data)) [1] 26.32 0.71 27.02 0.00 0.00
二つの計算機からなるクラスタ (このときは同一の i686 ノード) では
約2倍早かった。
<R session>
> clusterEvalQ(cl, library(boot)) > system.time(cl.nuke.boot <- + clusterCall(cl,boot,nuke.data, nuke.fun, R=500, m=1, + fit.pred=new.fit, x.pred=new.data)) [1] 0.01 0.00 14.27 0.00 0.00
4台のノードのクラスタでは約6秒であった。
<R session>
> cl <- makeCluster(5) > clusterEvalQ(cl,library(boot)) > system.time(cl.nuke.boot <- + clusterCall(cl,boot,nuke.data, nuke.fun, R=200, m=1, + fit.pred=new.fit, x.pred=new.data)) [1] 0.03 0.00 5.58 0.00 0.00
速度を比較するのに使うべき値は三番目の経過時間である。
clusterApply を用いた高水準関数は
parLapply, parSapply, そして parApply を含む。
これらはそれぞれ lapply, sapply、そして apply
の並列版である。幾つかの例を示す:
<higher level examples>
sum(parApply(cl, matrix(1:100,10), 1, sum)) sum(parApply(cl, matrix(1:10000,100), 1, sum))
<higher level examples>
x <- 1:100/101 system.time(qtukey(x, 2, df=2)) system.time(unlist(parLapply(cl, x, qtukey, 2, df=2)))
解説のために行列積の並列計算の非常に簡単な例をあげる:
<higher level examples>
A <- matrix(rnorm(10000),100) system.time(A %*% A) system.time(parMM(cl,A , A))
留意すべき幾つかの注意:
PVM コンソール、もしくは lamhalt と lamwipe を使って
PVM もしくは LAM-MPI 領域を停止することにより R プロセスを殺すことができる。
ソケットを使った実装では、マスタが存在するときはどんな稼働中のノードも
残すべきではない。しかし、妙な具合でそうなることもあり得る。
解説のために行列積の並列計算の非常に簡単な例をあげる:
<higher level examples>
A <- matrix(rnorm(10000),100) system.time(A %*% A) system.time(parMM(cl,A , A))
留意すべき幾つかの注意:
PVM コンソール、もしくは lamhalt と lamwipe を使って PVM もしくは LAM-MPI 領域を停止することにより R プロセスを殺すことができる。 ソケットを使った実装では、マスタが存在するときはどんな稼働中のノードも 残すべきではない。しかし、妙な具合でそうなることもあり得る。 時としてまずいことが起き得、手動による後かたづけが必要になる。
エラー処理は現在のところ非常に素朴である。ワーカノードでの全ての評価は try 関数を用いて実行される。従って、返り値は真正の結果であるか、 try 関数が返すエラーである。原則としてユーザのコードがこれをチェックすべきである。
幾つかのノードがエラーを出し、その他はエラーにならない状況を処理する正しい方法は 明らかでなく、問題による。R がより洗練されたエラー処理機構を備えるようになれば、 snow 中のエラー処理に対する柔軟なユーザ制御をその上に構築することが できるであろう。
理想的には、マスタに於ける中断はワーカに伝播すべきで、現在進行中の全ての計算を中断すべきである。 しかしそうなってはいない。実際、snow を使った計算中のマスタ側での中断は 通信基盤を混乱した状態に陥れ、それ以降現在の R セッションでのクラスタの利用を不可能にする。 一時しのぎの解決策: snow による計算を中断してはならない。勿論これは満足のいく解決策ではない。 R が中断に対する処理を制御する機構を持てば、もう少しましなことが可能になるであろう。 実際に中断をワーカノードに伝播させることが可能になるかどうかは全く不明で OS に依存するかもしれない。
SNOWクラスタで使う独立一様乱数ストリームを初期化する。L'Ecuyer の乱数発生器 (パッケージ rlecuyer が必要) もしくは SPRNG 発生器(パッケージ rsprng が必要)のどちらかを使う。
clusterSetupRNG (cl, type = "RNGstream", ...) clusterSetupRNGstream (cl, seed=rep(12345,6), ...) clusterSetupSPRNG (cl, seed = round(2^32 *runif(1)), prngkind = "default", para = 0, ...)
cl: クラスタオブジェクト type: 'type="RNGstream"' (既定) は L'Ecuyer の RNG、 'type="SPRNG"' は SPRNG 発生器を使う ...: 背景にある関数(以下の詳細を見よ)へ渡される引数 seed: RNGの種として使われる整数値 (SPRNG) もしくは長さ6の整数ベクトル prngkind: SPRNG で使われる発生法タイプの名前文字列 para: 発生器にたいする追加引数
## Not run: clusterSetupSPRNG(cl) clusterSetupSPRNG(cl, seed=1234) clusterSetupRNG(cl, seed=rep(1,6)) ## End(Not run)
SNOWクラスタ上で計算を行う関数。
clusterSplit(cl, seq) clusterCall(cl, fun, ...) clusterApply(cl, x, fun, ...) clusterApplyLB(cl, x, fun, ...) clusterEvalQ(cl, expr) clusterExport(cl, list)
cl: クラスタオブジェクト fun: 関数もしくは関数名を与える文字列 expr: 評価すべき表現式 seq: 分割されるベクトル list: エクスポートされる変数名の文字列 x: 配列 ...: 標準関数に引き渡される追加引数
## Not run: cl <- makeSOCKcluster(c("localhost","localhost")) clusterApply(cl, 1:2, get("+"), 3) clusterEvalQ(cl, library(boot)) x<-1 clusterExport(cl, "x") clusterCall(cl, function(y) x + y, 2) ## End(Not run)
SNOWクラスタを開始・停止し、クラスタオプションを設定する関数。
makeCluster(spec, type = getClusterOption("type"), ...) stopCluster(cl) setDefaultClusterOptions(...) makeSOCKcluster(names, ..., options = defaultClusterOptions) makePVMcluster(count, ..., options = defaultClusterOptions) makeMPIcluster(count, ..., options = defaultClusterOptions) getMPIcluster()
spec: クラスタ指定 count: 生成するノー度数 names: ノード名の文字列ベクトル options: クラスタオプションオブジェクト cl: クラスタオブジェクト ...: クラスタオプション指定 type: クラスタのタイプを指定する文字列
## Not run: cl <- makeCluster(c("localhost","localhost"), type = "SOCK") clusterApply(cl, 1:2, get("+"), 3) ## End(Not run)
'apply' 関数の並列版と関連関数。
parLapply(cl, x, fun, ...) parSapply(cl, X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE) parApply(cl, X, MARGIN, FUN, ...) parRapply(cl, x, fun, ...) parCapply(cl, x, fun, ...) parMM(cl, A, B)
cl: クラスタオブジェクト fun: 関数もしくは関数名文字列 X: 使用される配列 x: 使用される行列 FUN: 関数もしくは関数名文字列 MARGIN: 使用される次元を指定するベクトル simplify: 論理値、'sapply' を参照 USE.NAMES: 論理値、'sapply' を参照 ...: 標準関数に引き渡される追加引数 A: 行列 B: 行列
## Not run: cl <- makeSOCKcluster(c("localhost","localhost")) parSapply(cl, 1:20, get("+"), 3) ## End(Not run)
snow パッケージが依存している Rmpi パッケージは MPI (Message-Passing Interface) と呼ばれるクラスタ構成ソフトへのインタフェイスで、それ自体 R でクラスタ並列計算を行う多くの関数が提供されているようです。以下にパッケージ内の関数の簡易説明一覧を紹介します。
mpi.abort Abort (quit) all tasks associated with a comm mpi.allgather Gather data from each process to all process mpi.allgatherv Gather diff size data from each process to all process mpi.allreduce Reduce all process's vectors into one vector mpi.barrier Block the caller until all group have called it mpi.bcast Broadcast a vector (int,double,char) to every process mpi.cancel Cancel a nonblocking send or recv mpi.cart.coords Translate a rank to the Cartesian topology coordinate mpi.cart.create Create a Cartesian structure of arbitrary dimension mpi.cartdim.get Get dim information about a Cartesian topology mpi.cart.get Provide the Cartesian topology associated with a comm mpi.cart.rank Translate a Cartesian topology coordinate to the rank mpi.cart.shift Shift Cartesian topology in displacement and direction mpi.comm.disconnect Disconeect and free a comm mpi.comm.dup Duplicate a comm to a new comm mpi.comm.free Free a comm mpi.comm.get.parent Get the parent intercomm mpi.comm.rank Find the rank (process id) of master and slaves mpi.comm.remote.size Find the size of a remote group from an intercomm mpi.comm.size Find the size (total # of master and slaves) mpi.comm.set.errhandler Set comm to error return (no crash) mpi.comm.spawn Spawn slaves mpi.comm.test.inter Test if a comm is an intercomm mpi.dims.create Create a Cartesian dim used by mpi.cart.create mpi.finalize Exit MPI environment (call MPI_Finalize()) mpi.gather Gather data from each process to a root process mpi.gatherv Gather diff data from each process to a root process mpi.get.count Get the length of a message for given status and type mpi.get.processor.name Get the process (host) name mpi.info.create Create an info object mpi.info.free Free an info object mpi.info.get Get the value from an info object and a key mpi.info.set Set a key/value pair of an info object mpi.intercomm.merge Merge a intercomm to a comm mpi.iprobe Nonblocking use a source and a tag to set status mpi.irecv Nonblocking receive a vector from a specific process mpi.isend Nonblocking send a vector to a specific process mpi.probe Use a source and a tag to set status mpi.recv Receive a vector from a specific process mpi.reduce Reduce all processes's vectors into one (one process) mpi.scatter Opposite of mpi.gather mpi.scatterv Opposite of mpi.gatherv (diff size data) mpi.send Send a vector to a specific process mpi.sendrecv Send & receive different vectors in one call mpi.sendrecv.replace Send & replace a vector in one call mpi.test Test if a nonblocking send/recv request is complete mpi.testall Test if all nonblocking send/recv requests are complete mpi.testany Test if any nonblocking send/recv requests are complete mpi.testsome Test if some nonblocking send/recv requests are complete mpi.test.cancelled Test if a communication is cancelled by mpi.cancel mpi.universe.size Total number of CPUs available mpi.wait Wait if a nonblocking send/recv request is complete mpi.waitall Wait if all nonblocking send/recv requests are complete mpi.waitany Wait if any nonblocking send/recv requests are complete mpi.waitsome Wait if some nonblocking send/recv requests are complete
lamhosts Hosts id and machine host name mapping mpi.allgather.Robj Gather any type of objects to every number mpi.any.source A constant for receiving a message from any source mpi.any.tag A constant for receiving a message from any tag mpi.bcast.Robj Broadcast an R object to every process mpi.comm.maxsize Find the length of comm array mpi.exit MPI_Finalize を呼出し、Rmpi ライブラリを切り離す(detach) mpi.gather.Robj Gather any type of object to a root process mpi.get.sourcetag Get the source and tag for a given status mpi.hostinfo Get the host information that the process is running mpi.init.sprng rsprng ライブラリ中の SPRNG を初期化する mpi.is.master TRUE if it is a master otherwise FALSE (slave) mpi.isend.Robj Nonblocking send an R object to a specific process mpi.proc.null Dummy source and destination mpi.quit MPI_Finalize を呼出し R を終了する mpi.recv.Robj Receive an R object from a process (by mpi.send.Robj) mpi.realloc.comm Increase comm array to a new size mpi.realloc.request Increase request array to a new size mpi.realloc.status Increase status array to a new size mpi.request.maxsize Find the length of request array mpi.scatter.Robj Scatter an list to every number mpi.send.Robj Send an R object to a specific process mpi.spawn.Rslaves Spawn R slaves. The default R script is slavedaemon.R mpi.status.maxsize Find the length of status array mpichosts finds host names from master Windows registery database
mpi.apply 配列をスレーブに分配し、それから fun を適用する mpi.applyLB mpi.apply の負荷均等版 mpi.bcast.Robj2slave Master sends an Robj to all slaves mpi.bcast.cmd 全てのプロセスにある命令をブロードキャストする mpi.close.Rslaves mpi.spawn.Rslaves() で起動された全てのスレーブを閉じる mpi.parApply (負荷均等版) 並列 apply 関数 mpi.parCapply (負荷均等版) 列への並列 apply 関数 mpi.parLapply (負荷均等版) 並列 lapply 関数 mpi.parRapply (負荷均等版) 行への並列 apply 関数 mpi.parReplicate ある表現式の反復評価のための mpi.parSapply 関数へのラッパ関数 mpi.parSapply (負荷均等版) 並列 sapply 関数 mpi.parSim (負荷均等版) 並列モンテカルロシミュレーション mpi.remote.exec ある命令をスレーブで遠隔実行し、結果をマスタに返す mpi.setup.rngstream パッケージ rlecuyer の RNDstream を全てのスレーブで設定する mpi.setup.sprng パッケージ rsprng の SPRNG を全てのスレーブで設定する slave.hostinfo 全てのスレーブの rank, comm, host information を示す tailslave.log スレーブのログファイルの末尾部分を表示する
bin.nchar Find the length of a binary string mpi.comm.is.null Test if a comm is NULL (no members) string Create a string (empty space character) buffer
パッケージ rpvm はPVM (Parallel Virtual Machine) API へのRインタフェイスを提供する。
.PVM.barrier Group synchronization .PVM.bcast Broadcasting the data .PVM.bufinfo Message buffer infomation .PVM.config PVMD configuration .PVM.exit Unregister process from local PVM deamon. .PVM.freebuf Free message buffer .PVM.gather Gather the data into root .PVM.getinst Instance number identified by group name and task id .PVM.getsbuf Manipulating Message Buffers .PVM.gettid Task id identified by group name and instance number .PVM.gsize Get the size of the group .PVM.initsend Initialize send buffer .PVM.joingroup Join or leave a names group .PVM.kill pvm プロセスを停止する .PVM.mcast Multicast data .PVM.mkbuf Create message buffer .PVM.mstats Status of host machines .PVM.mytid Task IDs .PVM.notify Monitor pvmd .PVM.nrecv Nonblocking receive .PVM.probe Probe receive .PVM.pstats Status of PVM processes .PVM.recv Blocking receive .PVM.reduce Reduction .PVM.scatter Scatter a vector across the group .PVM.send Send data .PVM.serialize Serialize R Objects .PVM.spawn Spawn child tasks .PVM.tasks Tasks information .PVM.tidtohost Host id of a task .PVM.trecv Timeout receive PVM.options libpvm Options PVM.pack Packing data PVM.rapply 並列版 apply 関数 PVM.unpack Unpacking data PVMD Vitural Machine Control init.sprng.master SPRNG を初期化する rsprng へのインタフェイス