并行计算花费相同或更多时间

时间:2014-10-27 16:34:42

标签: r foreach parallel-processing cluster-computing

我正在尝试在R中建立并行计算以进行大型模拟,但我注意到时间没有任何改进。

我尝试了一个简单的例子:

library(foreach)
library(doParallel)

stime<-system.time(for (i in 1:10000) rnorm(10000))[3]
print(stime)
10.823

cl<-makeCluster(2)
registerDoParallel(cores=2)
stime<-system.time(ls<-foreach(s = 1:10000) %dopar% rnorm(10000))[3]
stopCluster(cl)
print(stime)
29.526

系统时间是没有并行计算的原始情况下的两倍多。

显然我做错了什么,但我无法弄清楚它是什么。

1 个答案:

答案 0 :(得分:2)

并行执行许多微小任务可能效率很低。标准解决方案是使用 chunking

ls <- foreach(s=1:2) %dopar% {
  for (i in 1:5000) rnorm(10000)
}

这个循环不是并行执行10,000个微小任务,而是执行两个较大的任务,运行速度几乎是Linux机器上顺序版本的两倍。

另请注意您的&#34; foreach&#34;实例实际上是从工人向主人发送大量数据。我的&#34; foreach&#34;例子就像你的顺序例子一样抛出数据,所以我认为这是一个更好的比较。

如果您需要返回大量数据,那么公平的比较将是:

ls <- lapply(rep(10000, 10000), rnorm)

ls <- foreach(s=1:2, .combine='c') %dopar% {
  lapply(rep(10000, 5000), rnorm)  
}

在我的Linux机器上,时间是8.6秒而不是7.0秒。由于通信与计算比率较大,这并不令人印象深刻,但如果我没有使用分块,情况会更糟。