0

この質問には、R でベクトル化された関数を並列化する最も簡単な方法は何ですか?に回答がありません。私は簡単な方法を求めているのではなく、マスター/スレーブシステムを介して、プロセスが何をし、いつ終了するかをさらに制御することを求めているからです。

ここに私の問題があります:私は正常に使用されmcparallelmccollect次の行に沿っていくつかのタスクを並列化しましXた(リストです):

p1 <- mcparallel( lapply( X[1:25],  function(x) my.function(x, theta) ) )
p2 <- mcparallel( lapply( X[26:50], function(x) my.function(x, theta) ) )
p3 <- mcparallel( lapply( X[51:75], function(x) my.function(x, theta) ) )
x4 <- lapply(X[76:100], function(x) my.function(x, theta) )

c( mccollect(p1), mccollect(p2), mccollect(p3), x4 )

の要素Xは大きく、パラメータthetaは小さく、目的は の最適化を実行することですthetamclapply(X, ...)私の問題ではパフォーマンスが非常に悪いことに注意してください(ほとんど時間がかかりません)。私もパッケージ%dopar%から試してみましたforeach:まったく時間がかかりませんでした!

オーバーヘッドを削減し、各計算での新しいフォークを回避するために、この Rmpi​​ チュートリアルで例示されているように、マスター/スレーブ ロジックを使用したいと思います。スレーブに の新しい値を供給することができましたtheta。これにより、新しい計算ごとに新しいフォークが回避され、新しいフォークごとにメモリ全体がコピーされます。thetaが小さく、 の結果も同様であるため、my.functionプロセス間の計算は高速になり、後続の計算でかなりの時間を得ることができます。

ただし、MPI は複数のコンピューターを使用するのにより適したプロトコルであると言われています。私はマルチコア コンピューター (16 コア) を使用していますが、より軽いプロトコルが適していると言われています。

アドバイスをいただけますか?特に、parallelパッケージを使用して、マルチコア コンピューターにマスター/スレーブ システムを実装することは可能ですか?

4

1 に答える 1

0

私は一種の解決策を見つけました。

> library('parallel')
> makeCluster(2) -> cl
> # loading data to nodes:
> invisible(clusterApply( cl, 4:5, function(t) a <<- t ))
> # computations on these data with different arguments
> clusterApply( cl, 1:2, function(t) a+t )
[[1]]
[1] 5

[[2]]
[1] 7
> clusterApply( cl, 10:11, function(t) a+t )
[[1]]
[1] 14

[[2]]
[1] 16
> stopCluster(cl)

私はそれが私が望むことをすると思いますが、私はまだ他の提案を待っています(したがって、私は自分の答えを受け入れません)。

于 2013-03-16T08:32:20.663 に答える