La mia risposta predefinito utilizzato per essere "bene, allora non farlo" (usando foreach) come il pacchetto snow fa questo (affidabile!) per te.
Ma come sottolinea @Spacedman, il nuovo doRNG di Renaud è quello che stai cercando se desideri rimanere con la famiglia doFoo
/foreach.
La vera chiave è una chiamata cluster in stile App per ottenere il set di semi su tutti i nodi. E in modo coordinato attraverso i flussi. Oh, e ho detto che lo snow di Tierney, Rossini, Li e Sevcikova ha fatto questo per voi per quasi un decennio?
Edit: E mentre non ha chiesto circa snow, per completezza ecco un esempio dalla riga di comando:
[email protected]:~$ r -lsnow -e'cl <- makeSOCKcluster(c("localhost","localhost"));\
clusterSetupRNG(cl);\
print(do.call("rbind", clusterApply(cl, 1:4, \
function(x) { stats::rnorm(1) })))'
Loading required package: utils
Loading required package: utils
Loading required package: rlecuyer
[,1]
[1,] -1.1406340
[2,] 0.7049582
[3,] -0.4981589
[4,] 0.4821092
[email protected]:~$ r -lsnow -e'cl <- makeSOCKcluster(c("localhost","localhost"));\
clusterSetupRNG(cl);\
print(do.call("rbind", clusterApply(cl, 1:4, \
function(x) { stats::rnorm(1) })))'
Loading required package: utils
Loading required package: utils
Loading required package: rlecuyer
[,1]
[1,] -1.1406340
[2,] 0.7049582
[3,] -0.4981589
[4,] 0.4821092
[email protected]:~$
Edit: E per completezza, ecco il vostro esempio combinato con quello che è nella documentazione per doRNG
> library(foreach)
R> library(doMC)
Loading required package: multicore
Attaching package: ‘multicore’
The following object(s) are masked from ‘package:parallel’:
mclapply, mcparallel, pvec
R> registerDoMC(2)
R> library(doRNG)
R> set.seed(123)
R> a <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
R> set.seed(123)
R> b <- foreach(i=1:2,.combine=cbind) %dopar% {rnorm(5)}
R> identical(a,b)
[1] FALSE ## ie standard approach not reproducible
R>
R> seed <- doRNGseed()
R> a <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> b <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> doRNGseed(seed)
R> a1 <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> b1 <- foreach(i=1:2,combine=cbind) %dorng% { rnorm(5) }
R> identical(a,a1) && identical(b,b1)
[1] TRUE ## all is well now with doRNGseed()
R>
Grazie per esempio alla neve. Non sono esperto di complessità della programmazione parallela in R, quindi ho iniziato a usare 'foreach' per la sua transizione indolore da codice non parallelo a parallelo. Sapevo che mi mancava qualcosa. – mpiktas
Beh, è per questo che tutti abbiamo iniziato anni fa con la neve perché la transizione dalle funzioni standard * apply() a quelle parallele era semplice :) –