我熟悉foreach
,%dopar%
之类的。我也parallel
熟悉cv.glmnet
. 但是您如何设置嵌套并行,如下所示?
library(glmnet)
library(foreach)
library(parallel)
library(doSNOW)
Npar <- 1000
Nobs <- 200
Xdat <- matrix(rnorm(Nobs * Npar), ncol = Npar)
Xclass <- rep(1:2, each = Nobs/2)
Ydat <- rnorm(Nobs)
并行交叉验证:
cl <- makeCluster(8, type = "SOCK")
registerDoSNOW(cl)
system.time(mods <- foreach(x = 1:2, .packages = "glmnet") %dopar% {
idx <- Xclass == x
cv.glmnet(Xdat[idx,], Ydat[idx], nfolds = 4, parallel = TRUE)
})
stopCluster(cl)
不是并行交叉验证:
cl <- makeCluster(8, type = "SOCK")
registerDoSNOW(cl)
system.time(mods <- foreach(x = 1:2, .packages = "glmnet") %dopar% {
idx <- Xclass == x
cv.glmnet(Xdat[idx,], Ydat[idx], nfolds = 4, parallel = FALSE)
})
stopCluster(cl)
对于这两个系统时间,我只得到了非常微小的差异。
是并行化的吗?还是我需要明确使用嵌套运算符?
附带问题:如果集群对象中有 8 个内核可用并且foreach
循环包含两个任务,每个任务会被分配 1 个内核(其他 6 个内核空闲)还是每个任务会被分配 4 个内核(用完所有 8 个内核总共)?查询在给定时间正在使用多少个内核的方法是什么?