为什么doParallel R在这种情况下表现更差?
有人能解释为什么Parlappy是最慢的吗为什么doParallel R在这种情况下表现更差?,r,parallel-processing,R,Parallel Processing,有人能解释为什么Parlappy是最慢的吗 > 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
> 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
>cl myVar微基准(
+Reduce(“+”,parLapply(cl,myVar,函数(X)X^2)),
+Reduce(“+”,lappy(myVar,函数(X)X^2)),
+减少(“+”,myVar^2)
+ )
单位:毫秒
expr最小lq平均uq最大neval
Reduce(“+”,parLapply(cl,myVar,函数(X)X^2))6.988662 8.041860 9.061966 8.901447 9.916621 14.541828 100
Reduce(“+”,lappy(myVar,函数(X)X^2))5.256892 5.626853 6.892995 6.259239 8.165724 11.112812 100
减少(“+”,myVar^2)1.930513 2.137887 2.613923 2.279481 3.000740 6.194623 100
根据这些评论,我添加了一个sum实现和一个矢量化实现:
> 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
>vec\u exp cl myVar微基准(
+Reduce(“+”,parLapply(cl,myVar,函数(X)X^2)),
+Reduce(“+”,lappy(myVar,函数(X)X^2)),
+减少(“+”,myVar^2),
+总和(myVar^2),
+减少(“+”,vec_exp(myVar))
+ )
单位:微秒
expr最小lq平均uq最大neval
Reduce(“+”,parLapply(cl,myVar,函数(X)X^2))6880.426 7086.400 7589.02901 7253.886 7625.246 12055.674 100
Reduce(“+”,lappy(myVar,函数(X)X^2))5073.0785356.0305826.332765478.0295728.3248472.236100
减少(“+”,myVar^2)1922.582 1998.861 2174.07136 2041.548 2129.023 4427.864 100
总额(myVar^2)13.530 17.495 19.65554 18.662 20.528 34.990 100
减少(“+”,vec_exp(myVar))5686.102 5967.655 6632.46879 6210.952 6671.186 16191.488 100
更多处理器开始投入使用。然而,对于您的情况,设置并行系统的延迟(即使没有核心,它不应该是1)在您的问题中起着重要作用
无论大小,生成集群通常需要花费大量时间,这使得简单计算的并行效率降低。如果可能的话,最好使用它们,并充分利用底层硬件
此外,对并行lappy函数的调用要求它设置所有消息传递例程,将数据拆分(在您的情况下为1),并准备在计算后接收数据。这表示您正在经历的延迟
另一方面,序列lappy只是开始它的计算,而不是担心上面的任何一个。由于计算非常简单,它往往会更快地完成。(也就是说,它不需要随便摆弄Parlappy需要做的任何设置。)
我建议比较2+核心并行方案。这里您应该看到,对于简单/快速的计算,最好保持程序的串行性,对于更复杂的程序,它有助于分配工作(如果可能) 更多处理器开始投入使用。然而,对于您的情况,设置并行系统的延迟(即使没有核心,它不应该是1)在您的问题中起着重要作用
无论大小,生成集群通常需要花费大量时间,这使得简单计算的并行效率降低。如果可能的话,最好使用它们,并充分利用底层硬件
此外,对并行lappy函数的调用要求它设置所有消息传递例程,将数据拆分(在您的情况下为1),并准备在计算后接收数据。这表示您正在经历的延迟
另一方面,序列lappy只是开始它的计算,而不是担心上面的任何一个。由于计算非常简单,它往往会更快地完成。(也就是说,它不需要随便摆弄Parlappy需要做的任何设置。)
我建议比较2+核心并行方案。这里您应该看到,对于简单/快速的计算,最好保持程序的串行性,并且对于更复杂的程序,它有助于分发工作(如果可能) 只有当并行化的操作比复制数据要昂贵得多时,并行化才有意义。x^2的成本与复制x差不多——这不是一个适合并行化的用例。您只是产生了很多开销。由于这是高度可校正的,请将计时与
sum(myVar^2)
进行比较。另请参见@user2589273 answerParallelization,只有在并行化操作的成本明显高于复制数据的情况下,并行化才有意义。x^2的成本与复制x差不多——这不是一个适合并行化的用例。您只是产生了很多开销。由于这是高度可校正的,请将计时与sum(myVar^2)
进行比较。另请参见@user2589273 answerI查看了“矢量化”文档,并尝试包含上面的实现,但我不确定一般何时使用它。你能解释一下什么时候应该使用Vectorize
而不是并行实现或非并行实现吗?我看了一下“Vectorize”文档,并试图在上面包含一个实现,但我不确定通常什么时候使用它。您能否详细解释一下什么时候应该使用矢量化
,而不是并行或非并行实现?