gpt4 book ai didi

r - R : %dopar% vs %do%. 中的并行化为什么使用单核可以获得更好的性能?

转载 作者:行者123 更新时间:2023-12-04 14:30:20 25 4
gpt4 key购买 nike

使用 doMC 和 foreach 在其内核之间分配进程时,我在计算机中遇到了奇怪的行为。有人知道为什么使用单核比使用 2 核获得更好的性能吗?如您所见,在不注册任何内核(据说只使用 1 个内核)的情况下处理相同的代码会产生更多的时间效率处理。虽然 %do% 似乎比 %dopar% 性能更好,但注册 4 个内核中的 2 个会导致更耗时。

require(foreach)
require(doMC)
# 1-core
> system.time(m <- foreach(i=1:100) %dopar%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
9.285 1.895 11.083
> system.time(m <- foreach(i=1:100) %do%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
9.139 1.879 10.979

# 2-core
> registerDoMC(cores=2)
> system.time(m <- foreach(i=1:100) %dopar%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
3.322 3.737 132.027
> system.time(m <- foreach(i=1:100) %do%
+ matrix(rnorm(1000*1000), ncol=5000) )
user system elapsed
9.744 2.054 11.740

在少数试验中使用 4 个内核会产生非常不同的结果:
> registerDoMC(cores=4)
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
11.522 4.082 24.444
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
21.388 6.299 25.437
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
17.439 5.250 9.300
> system.time(m <- foreach(i=1:100) %dopar%
{ matrix(rnorm(1000*1000), ncol=5000) } )
user system elapsed
17.480 5.264 9.170

最佳答案

结果的组合占用了所有处理时间。这些是我机器上 cores=2 的时间如果没有返回结果的场景。它本质上是相同的代码,只有创建的矩阵被丢弃而不是被返回:

> system.time(m <- foreach(i=1:100) %do% 
+ { matrix(rnorm(1000*1000), ncol=5000); NULL } )
user system elapsed
13.793 0.376 14.197
> system.time(m <- foreach(i=1:100) %dopar%
+ { matrix(rnorm(1000*1000), ncol=5000); NULL } )
user system elapsed
8.057 5.236 9.970

仍然不是最优的,但至少并行版本现在更快了。

这是来自 doMC 的文档:

The doMC package provides a parallel backend for the foreach/%dopar% function using the multicore functionality of the parallel package.



现在, parallel使用 fork产生 R 进程的相同副本的机制。从单独的进程收集结果是一项昂贵的任务,这就是您在时间测量中看到的。

关于r - R : %dopar% vs %do%. 中的并行化为什么使用单核可以获得更好的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15194465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com