6

使用 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
4

1 回答 1

8

结果的组合占用了所有的处理时间。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

该包使用包的多核功能为 /函数doMC提供并行后端 。foreach%dopar%parallel

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

于 2013-03-04T04:52:08.687 回答