【问题标题】:Parallel computing taking same or more time并行计算需要相同或更多时间
【发布时间】:2014-12-22 21:54:30
【问题描述】:

我正在尝试在 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

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

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

【问题讨论】:

  • 并行计算涉及开销。这个结果是意料之中的。
  • 您的意思是启动集群需要时间?或者你是什么意思?
  • 是的,但我只是在测量任务本身,而不是初始化集群所需的时间。我应该在什么时候获得更大的收益?
  • 即使只是集群初始化后的协调,例如将所有内容组合回一个数组,需要时间和开销。此外,根据您进行并行计算的方式,您还会通过上下文切换等产生开销。
  • 您需要运行profile(我认为这是函数名称)来查看设置数据传递到每个节点所花费的时间与节点处理所花费的时间数据。一般来说(开始一个句子的危险方式:-)),并行性仅在您发送相对较少的数据但对所述数据进行大量处理时才有帮助。

标签: r foreach parallel-processing cluster-computing


【解决方案1】:

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

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

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

还请注意,您的“foreach”示例实际上是从工作人员向主服务器发送大量数据。我的“foreach”示例就像您的顺序示例一样丢弃了这些数据,所以我认为这是一个更好的比较。

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

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

对比:

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

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

【讨论】:

  • 不确定 lapply 正在做您认为的事情吗?
  • @MartinMorgan 哎呀。谢谢你指出这一点,马丁。希望现在是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2019-09-28
  • 2022-07-26
  • 2021-06-24
相关资源
最近更新 更多