当我试图理解R
包parallel
的文档时,我在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 )工作进程完全无用?谢谢。
答案 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