我正在尝试在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
系统时间是没有并行计算的原始情况下的两倍多。
显然我做错了什么,但我无法弄清楚它是什么。
答案 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秒。由于通信与计算比率较大,这并不令人印象深刻,但如果我没有使用分块,情况会更糟。