この質問には、R でベクトル化された関数を並列化する最も簡単な方法は何ですか?に回答がありません。私は簡単な方法を求めているのではなく、マスター/スレーブシステムを介して、プロセスが何をし、いつ終了するかをさらに制御することを求めているからです。
ここに私の問題があります:私は正常に使用されmcparallel
、mccollect
次の行に沿っていくつかのタスクを並列化しまし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
は小さく、目的は の最適化を実行することですtheta
。mclapply(X, ...)
私の問題ではパフォーマンスが非常に悪いことに注意してください(ほとんど時間がかかりません)。私もパッケージ%dopar%
から試してみましたforeach
:まったく時間がかかりませんでした!
オーバーヘッドを削減し、各計算での新しいフォークを回避するために、この Rmpi チュートリアルで例示されているように、マスター/スレーブ ロジックを使用したいと思います。スレーブに の新しい値を供給することができましたtheta
。これにより、新しい計算ごとに新しいフォークが回避され、新しいフォークごとにメモリ全体がコピーされます。theta
が小さく、 の結果も同様であるため、my.function
プロセス間の計算は高速になり、後続の計算でかなりの時間を得ることができます。
ただし、MPI は複数のコンピューターを使用するのにより適したプロトコルであると言われています。私はマルチコア コンピューター (16 コア) を使用していますが、より軽いプロトコルが適していると言われています。
アドバイスをいただけますか?特に、parallel
パッケージを使用して、マルチコア コンピューターにマスター/スレーブ システムを実装することは可能ですか?