2016-07-06 10 views
10

parLapplyLB()関数をテストして、負荷のバランスをとるために何を行うのかを理解しています。しかし、バランスのとれたことは起こっていません。それは本当に負荷を分散している場合たとえば、なぜparLapplyLBは実際に負荷のバランスを取っていませんか?

cl <- parallel::makeCluster(2) 

system.time(
    parallel::parLapplyLB(cl, 1:4, function(y) { 
    if (y == 1) { 
     Sys.sleep(3) 
    } else { 
     Sys.sleep(0.5) 
    }})) 
## user system elapsed 
## 0.004 0.009 3.511 

parallel::stopCluster(cl) 

、3秒間スリープ最初の仕事(ジョブ1)は、最初のノードになりますし、他の3つのジョブ(ジョブ2:4)はスリープうもう一方のノードでは合計1.5秒です。合計で、システム時間はわずか3秒でなければなりません。

代わりに、ノード1にジョブ1とジョブ2が与えられ、ノード2にジョブ3とノード4が与えられたと考えられます。その結果、合計時間は3 + 0.5 = 3.5秒になります。上記のコードをの代わりにparLapply()で実行すると、約3.5秒のシステム時間が得られます。

私は理解していないか間違っていますか?あなたの(そして、そのことについては、私が今まで並列を必要としてきている任意のタスクのために)parLapplyLB本当に仕事のための適切なツールではありませんのようなタスクのために

+0

私はRが自動負荷分散をしないと思います。私は、各タスクを実行するのにかかる時間に関係なく、または各タスクが完了したときに、利用可能な数のコアに*タスク*を分割すると思います。それはタスクのキューがあるようにではなく、1人の作業者がそれを終了したときに次のタスクを取得します。各コアには2つのタスクが割り当てられました。したがって、最初の作業者は3 + 0.5、合計は3.5です。 *間違っているとうれしいです* – gregmacfarlane

+3

はい、それは3.5が来ているところです。それは負荷のバランスを取っていません。しかし、parLapplyLBはバランスをとると主張しています。 – josiekre

答えて

10

parLapplyLB 
# function (cl = NULL, X, fun, ...) 
# { 
#  cl <- defaultCluster(cl) 
#  do.call(c, clusterApplyLB(cl, x = splitList(X, length(cl)), 
#   fun = lapply, fun, ...), quote = TRUE) 
# } 
# <bytecode: 0x000000000f20a7e8> 
# <environment: namespace:parallel> 

## Have a look at what `splitList()` does: 
parallel:::splitList(1:4, 2) 
# [[1]] 
# [1] 1 2 
# 
# [[2]] 
# [1] 3 4 

問題は、それが最初にそれぞれのそれがその後、ノード間で配布するの同サイズのサブリスト、へのジョブのリストを分割していることである:、それは実現していますような方法を見ていない理由を確認するには指定されたサブリスト上でlapply()を実行します。ここでは、最初のノードは第1および第2の入力でジョブを実行し、第2のノードは第3および第4の入力を使用してジョブを実行します。

代わりに、あなたが期待したいだけのように動作しており、より汎用性clusterApplyLB()を使用します。それは意味的なバグがあるので

system.time(
    parallel::clusterApplyLB(cl, 1:4, function(y) { 
    if (y == 1) { 
     Sys.sleep(3) 
    } else { 
     Sys.sleep(0.5) 
    }})) 
# user system elapsed 
# 0.00 0.00 3.09 
+0

ありがとう!私が探していたもの。 parLapplyLBがparLapplyとは何か違うものを生み出すケースは考えられないので、その目的が分からない。 – josiekre

+0

'clusterApplyLB(cl、X、fun)'は 'parLapplyLB'と同じ動作をしていますか?私は自分のシステムでこれを試してきましたが、 'X'がリストであるときに同じ出力を出すようですが、' clusterApplyLB'で 'parLapplyLB'を交換するだけで少し気になります。 – guy

+2

有用な情報はこちらユーザー定義のparlapplyLB http://detritus.fundacioace.com/pub/books/Oreilly.Parallel.R.Oct.2011.pdf – Olivia

1

parLapplyLBは、負荷分散されていません。このバグを発見し、修正を提供しました。hereを参照してください。さて、R開発者の方々には、この修正が含まれています。

関連する問題