如何理解主人和工人的过程--- R包" parallel"?

时间:2015-11-19 22:26:02

标签: r rparallel

当我试图理解Rparallel的文档时,我在package's documentation的第8页上阅读了一些代码行时遇到了这个问题。我已经复制了以下代码。请注意mc等于2

# mc = 2
cl <- makeCluster(mc)
cd4.rg <- function(data, mle) MASS::mvrnorm(nrow(data), mle$m, mle$v)
cd4.mle <- list(m = colMeans(cd4), v = var(cd4))
clusterExport(cl, c("cd4.rg", "cd4.mle"))
junk <- clusterEvalQ(cl, library(boot)) # discard result
clusterSetRNGStream(cl, 123)
res <- clusterEvalQ(cl, boot(cd4, corr, R = 500,
+                   sim = "parametric", ran.gen = cd4.rg, mle = cd4.mle))
library(boot) # needed for c() method on master
cd4.boot <- do.call(c, res)
boot.ci(cd4.boot, type = c("norm", "basic", "perc"),
+                   conf = 0.9, h = atanh, hinv = tanh)
stopCluster(cl)

在第5行中,命令library(boot)已在cl上进行了评估,但在第8行library(boot)再次运行,作者说c()方法需要它在主人身上。

我最初的理解是:makeCluster(mc)创建了两个工作进程,主进程就是其中之一。现在看来makeCluster(mc)创建的每个工作程序都与主进程不同。因此library(boot)必须在主进程上运行。我对吗?

如果我有一个8核CPU,这是否意味着创建超过七个(&gt; 7 )工作进程完全无用?谢谢。

1 个答案:

答案 0 :(得分:0)

在我的系统上,可以看到makeCluster(2)创建2个其他 R进程(我在Windows上可以在资源监视器中看到它们)。所以&#34;工人&#34;似乎与&#34; master&#34;不同。过程

关于图书馆,快速检查方法是询问每个工作人员loadedNamespaces()。下面的记录显示了这两个工作人员加载的foreach包的示例,其中loadedNamespaces()表示工人和主人之前和之后。

由于只有工作进程用于执行clusterEvalQ的表达式,因此将工作者数量增加到最多8个似乎是合理的。真正的性能将取决于其他因素,例如8核系统上可用的逻辑核心数量,每个核心在处理过程中所做的事情,以及当时系统上发生的其他因素,......

文稿:

library(parallel)
cl <- makeCluster(2)
loadedNamespaces() # get loaded namespaces on master
# [1] "base"      "datasets"  "graphics"  "grDevices" "methods"   "parallel"  "stats"     "utils"
clusterEvalQ(cl, loadedNamespaces()) # get loaded namespaces on workers
# [[1]]
# [1] "base"      "datasets"  "graphics"  "grDevices" "methods"   "parallel"  "stats"     "utils"    
# 
# [[2]]
# [1] "base"      "datasets"  "graphics"  "grDevices" "methods"   "parallel"  "stats"     "utils"    
# 
invisible( clusterEvalQ(cl, library(foreach)) ) # load foreach on workers
loadedNamespaces() # check master
# [1] "base"      "datasets"  "graphics"  "grDevices" "methods"   "parallel"  "stats"     "utils"
clusterEvalQ(cl, loadedNamespaces()) # check workers
# [[1]]
#  [1] "base"      "codetools" "datasets"  "foreach"   "graphics"  "grDevices" "iterators" "methods"   "parallel"  "stats"     "utils"    
# 
# [[2]]
#  [1] "base"      "codetools" "datasets"  "foreach"   "graphics"  "grDevices" "iterators" "methods"   "parallel"  "stats"     "utils"    
# 
library(foreach) # load foreach on master
# foreach: simple, scalable parallel programming from Revolution Analytics
# Use Revolution R for scalability, fault tolerance and more.
# http://www.revolutionanalytics.com
loadedNamespaces() # check again
# [1] "base"      "codetools" "datasets"  "foreach"   "graphics"  "grDevices" "iterators" "methods"   "parallel"  "stats"     "utils"    
stopCluster(cl) # tidy up