2015-12-25 64 views
1

有人可以解釋爲什麼parLapply是最慢的?爲什麼doParallel R在這種情況下表現更差?

> cl <- makeCluster(no_cores) 
> myVar<-2:4000 
> microbenchmark(
+ Reduce("+",parLapply(cl,myVar,function(X) X^2)), 
+ Reduce("+",lapply(myVar,function(X) X^2)), 
+ Reduce("+",myVar^2) 
+) 
Unit: milliseconds 
               expr  min  lq  mean median  uq  max neval 
Reduce("+", parLapply(cl, myVar, function(X) X^2)) 6.988662 8.041860 9.061966 8.901447 9.916621 14.541828 100 
     Reduce("+", lapply(myVar, function(X) X^2)) 5.256892 5.626853 6.892995 6.259239 8.165724 11.112812 100 
           Reduce("+", myVar^2) 1.930513 2.137887 2.613923 2.279481 3.000740 6.194623 100 

基礎上的意見,我添加了一個總和實現和矢量實現:

> vec_exp<-Vectorize(function(x)x^2) 
> cl <- makeCluster(no_cores) 
> myVar<-2:4000 
> microbenchmark(
+ Reduce("+",parLapply(cl,myVar,function(X) X^2)), 
+ Reduce("+",lapply(myVar,function(X) X^2)), 
+ Reduce("+",myVar^2), 
+ sum(myVar^2), 
+ Reduce("+",vec_exp(myVar)) 
+) 
Unit: microseconds 
               expr  min  lq  mean median  uq  max neval 
Reduce("+", parLapply(cl, myVar, function(X) X^2)) 6880.426 7086.400 7589.02901 7253.886 7625.246 12055.674 100 
     Reduce("+", lapply(myVar, function(X) X^2)) 5073.078 5356.030 5826.33276 5478.029 5728.324 8472.236 100 
           Reduce("+", myVar^2) 1922.582 1998.861 2174.07136 2041.548 2129.023 4427.864 100 
             sum(myVar^2) 13.530 17.495 19.65554 18.662 20.528 34.990 100 
         Reduce("+", vec_exp(myVar)) 5686.102 5967.655 6632.46879 6210.952 6671.186 16191.488 100 
+8

只有並行化操作比複製數據昂貴得多,並行化纔有意義。 x^2或多或少與複製x相同的成本 - 這不是並行化的合適用例。你只是產生了很多開銷。 –

+0

由於這是高度可伸縮的比較時間與'sum(myVar^2)'。另請參見@ user2589273答案 – Rentrop

回答

4

更多處理器Amdahls law開始踢不過你的情況下,建立的等待時間。並行系統(即使沒有內核?不應該是1)在你的問題中扮演重要角色。

無論大小如何,生成羣集通常都需要很長時間,這使得簡單計算的並行性效率降低。如果可能的話,vectorise通常更好,並使用底層硬件充分利用。

此外,該呼叫並行lapply功能,它需要設置所有傳遞程序的消息,分割數據(1到你的情況),並準備接受一次計算。這呈現您正在經歷的延遲。

另一方面,系列樂譜只是開始計算,而不是擔心上述任何問題。由於計算非常簡單,因此往往會更快完成。 (也就是說,它並不需要在ParLapply必須做的任何設置上花費太多時間。)

我建議比較2+核心並行場景。在這裏您應該看到,對於簡單/快速計算,最好保持程序的連續性,並且使用更復雜的程序,這有助於分配工作(如果可能的話)。

+0

我看了一下'Vectorize'文檔,並試圖包含上面的實現,但我不確定何時使用它。你能解釋更多關於何時應該使用'Vectorize'而不是並行或只是非並行的實現嗎? – Rilcon42

相關問題