Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么doParallel R在这种情况下表现更差?_R_Parallel Processing - Fatal编程技术网

为什么doParallel R在这种情况下表现更差?

为什么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

有人能解释为什么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
                                               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”文档,并试图在上面包含一个实现,但我不确定通常什么时候使用它。您能否详细解释一下什么时候应该使用
矢量化
,而不是并行或非并行实现?