并行和串行处理的系统时间
System time for parallel and serial processing
我正在 运行 建立贝叶斯 MCMC probit 模型,并且我正在尝试并行实施它。在比较并行与串行时,我的机器性能结果令人困惑。我没有很多并行处理的经验,所以我可能做得不对。
我在概率模型的 MCMCpack
包中使用 MCMCprobit
,对于并行处理,我在 parallel
包中使用 parLapply
。
这是我的序列号代码 运行,以及来自 system.time
的结果:
system.time(serial<-MCMCprobit(formula=econ_model,data=mydata,mcmc=10000,burnin=100))
user system elapsed
657.36 73.69 737.82
这是我的并行代码 运行:
#Setting up the functions for parLapply:
probit_modeling <- function(...) {
args <- list(...)
library(MCMCpack)
MCMCprobit(formula=args$model, data=args$data, burnin=args$burnin, mcmc=args$mcmc, thin=1)
}
probit_Parallel <- function(mc, model, data,burnin,mcmc) {
cl <- makeCluster(mc)
## To make this reproducible:
clusterSetRNGStream(cl, 123)
library(MCMCpack) # needed for c() method on master
probit.res <- do.call(c, parLapply(cl, seq_len(mc), probit_modeling, model=model, data=data,
mcmc=mcmc,burnin=burnin))
stopCluster(cl)
return(probit.res)
}
system.time(test<-probit_Parallel(model=econ_model,data=mydata,mcmc=10000,burnin=100,mc=2))
以及 system.time
的结果:
user system elapsed
0.26 0.53 1097.25
知道为什么并行过程的用户和系统时间会短得多,但经过的时间却长得多吗?我在较短的 MCMC 运行s(100 和 1000)上尝试过,结果是一样的。我假设我在某处犯了错误。
这是我的电脑规格:
- R 3.1.3
- 8 GB 内存
- Windows 7 64 位
- 英特尔酷睿 i5 2520M CPU,双核
在我看来,两个工作人员所做的工作与顺序版本中执行的工作一样多。为了比代码的顺序版本执行得更快,工作人员应该只执行总工作的一小部分。在此示例中,这可以通过将 mcmc
除以工人数来实现,尽管这可能不是您真正想要做的。
我认为这可以解释 system.time
报告的长时间过去。 "user" 和 "system" 时间很短,因为它们是主进程的时间,在执行 parLapply
时使用很少的 CPU 时间:真正的 CPU 时间是system.time
.
未报告的工人使用的
我正在 运行 建立贝叶斯 MCMC probit 模型,并且我正在尝试并行实施它。在比较并行与串行时,我的机器性能结果令人困惑。我没有很多并行处理的经验,所以我可能做得不对。
我在概率模型的 MCMCpack
包中使用 MCMCprobit
,对于并行处理,我在 parallel
包中使用 parLapply
。
这是我的序列号代码 运行,以及来自 system.time
的结果:
system.time(serial<-MCMCprobit(formula=econ_model,data=mydata,mcmc=10000,burnin=100))
user system elapsed
657.36 73.69 737.82
这是我的并行代码 运行:
#Setting up the functions for parLapply:
probit_modeling <- function(...) {
args <- list(...)
library(MCMCpack)
MCMCprobit(formula=args$model, data=args$data, burnin=args$burnin, mcmc=args$mcmc, thin=1)
}
probit_Parallel <- function(mc, model, data,burnin,mcmc) {
cl <- makeCluster(mc)
## To make this reproducible:
clusterSetRNGStream(cl, 123)
library(MCMCpack) # needed for c() method on master
probit.res <- do.call(c, parLapply(cl, seq_len(mc), probit_modeling, model=model, data=data,
mcmc=mcmc,burnin=burnin))
stopCluster(cl)
return(probit.res)
}
system.time(test<-probit_Parallel(model=econ_model,data=mydata,mcmc=10000,burnin=100,mc=2))
以及 system.time
的结果:
user system elapsed
0.26 0.53 1097.25
知道为什么并行过程的用户和系统时间会短得多,但经过的时间却长得多吗?我在较短的 MCMC 运行s(100 和 1000)上尝试过,结果是一样的。我假设我在某处犯了错误。
这是我的电脑规格:
- R 3.1.3
- 8 GB 内存
- Windows 7 64 位
- 英特尔酷睿 i5 2520M CPU,双核
在我看来,两个工作人员所做的工作与顺序版本中执行的工作一样多。为了比代码的顺序版本执行得更快,工作人员应该只执行总工作的一小部分。在此示例中,这可以通过将 mcmc
除以工人数来实现,尽管这可能不是您真正想要做的。
我认为这可以解释 system.time
报告的长时间过去。 "user" 和 "system" 时间很短,因为它们是主进程的时间,在执行 parLapply
时使用很少的 CPU 时间:真正的 CPU 时间是system.time
.