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
本当に仕事のための適切なツールではありませんのようなタスクのために
私はRが自動負荷分散をしないと思います。私は、各タスクを実行するのにかかる時間に関係なく、または各タスクが完了したときに、利用可能な数のコアに*タスク*を分割すると思います。それはタスクのキューがあるようにではなく、1人の作業者がそれを終了したときに次のタスクを取得します。各コアには2つのタスクが割り当てられました。したがって、最初の作業者は3 + 0.5、合計は3.5です。 *間違っているとうれしいです* – gregmacfarlane
はい、それは3.5が来ているところです。それは負荷のバランスを取っていません。しかし、parLapplyLBはバランスをとると主張しています。 – josiekre