J'ai un cas étrange où l'utilisation foreach
avec un backend série et parallèle donne des résultats différents la première fois que j'appelle, mais plus tard, les deux résultats correspondent. Je RNG
pour rendre les résultats reproductibles pour la même seed
foreach avec backend série et parallèle donnant des résultats différents
est inférieure à une fonction exemple pour expliquer le scénario:
func <- function(ncores = NULL, seed = 1234){
if (!is.null(ncores)){ # this block registers for parallel backend
cl <- makeCluster(ncores)
registerDoParallel(cl)
registerDoRNG(seed, once = TRUE)
on.exit(stopCluster(cl))
} else { # this block registers for serial computation
registerDoSEQ()
registerDoRNG(seed, once = TRUE)
}
w = foreach(i = 1:10, .combine = 'c') %dorng% {
mean(sample(1:100, 50, replace = TRUE))
}
attr(w, "rng") <- NULL
return(w)
}
# first time running below 2 lines
# case 1 : serial
w1 <- func(ncores = NULL)
# Case 2 : parallel
w2 <- func(ncores= 5)
identical(w1, w2)
# second time running below 2 lines
# case 1: serial
w3 <- func(ncores = NULL)
# case 2: parallel
w4 <- func(ncores= 5)
identical(w1, w2)
# [1] FALSE
identical(w3, w4)
# [1] TRUE
Suis-je manque quelque chose lors de l'enregistrement processus séquentiel?
j'avais passé par la vignette avant .. mais n'a pas trouvé la raison de ce comportement. Bdw votre solution a résolu le problème +1. Savez-vous pourquoi 'registerDoRNG()' avait ce problème? –