2017-04-06 5 views
1

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 seedforeach 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?

Répondre

1

La solution est d'utiliser l'expression suivante:

w = foreach(i = 1:10, .combine = 'c', .options.RNG=seed) %dorng% { 
    mean(sample(1:100, 50, replace = TRUE))} 

Vous pouvez trouver une explication à la vignette here.

Ainsi, votre fonction ressemble à ceci:

func <- function(ncores = NULL, seed = 1234){ 
    if (!is.null(ncores)){ # this block registers for parallel backend 
    cl <- makeCluster(ncores) 
    registerDoParallel(cl) 
    on.exit(stopCluster(cl)) 
    } else {    # this block registers for serial computation 
    registerDoSEQ() 
    } 
    w = foreach(i = 1:10, .combine = 'c', .options.RNG=seed) %dorng% { 
    mean(sample(1:100, 50, replace = TRUE)) 
    } 
    attr(w, "rng") <- NULL 
    return(w) 
} 
+0

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? –