などに精通してい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)
2 つのシステム時間については、ごくわずかな差しかありません。
並列処理は行われていますか? または、ネストされた演算子を明示的に使用する必要がありますか?
副次的な質問: クラスター オブジェクトで 8 つのコアが使用可能で、foreach
ループに 2 つのタスクが含まれている場合、各タスクに 1 つのコアが割り当てられるか (残りの 6 つのコアはアイドル状態のまま)、または各タスクに 4 つのコアが割り当てられますか (8 つのコアすべてを使い果たす)合計で)?特定の時間に使用されているコアの数を照会する方法は何ですか?