sento il bisogno di elaborare su questo. Non reimpostare il seed in un ciclo parfor
e inoltre non utilizzare l'algoritmo di Mersenne Twister in parallelo (otterrete scarsi risultati di indipendenza statistica).
Il motivo per cui si ottengono risultati diversi è perché l'algoritmo è diverso a causa delle proprietà statistiche che questi numeri dovrebbero mantenere. In un pool parallelo MATLAB imposta l'algoritmo su "combRecursive" e imposta un diverso sottostream su ciascun worker, quindi per i numeri casuali che sei a posto. Inoltre, il ciclo parfor
non garantisce —
- L'ordine in cui i loop procedono,
- cui i lavoratori saranno in esecuzione ogni pezzo, o
- quante delle iterazioni sono eseguite su ogni lavoratore.
Pertanto, la generazione di numeri casuali in cicli parfor non restituirà generalmente gli stessi numeri casuali anche con lo stesso stato su ciascun lavoratore. Invece fare un RandStream con substreams dell'algoritmo combRecursive, impostare il flusso globale su ogni lavoratore in un blocco SPMD, quindi generare i numeri su ogni lavoratore in un blocco SPMD:
p = gcp; % Get or open a pool
numWork = p.NumWorkers; % Get the number of workers
s = RandStream.create('mrg32k3a','NumStreams',numWork,...
'CellOutput',true); % create numWork independent streams
n = 200; % number of values to generate on each worker
spmd
RandStream.setGlobalStream(s{labindex});
x = rand(1,n);
end
% I generate row vectors as the Composite matrix x will return a
% comma-separated list using the syntax, x{:}, which can then be
% concatenated into a single vector:
randVals2 = [x{:}]';
fonte
2015-08-26 19:01:05
Interessante. Non riesco a trovare la modifica del generatore di default menzionata in qualsiasi punto della documentazione. Sai se questo riguarda anche 'rand' e' randn'? A proposito, puoi accettare la tua risposta alla tua domanda. – horchler
+1 Molto interessante. Attenzione però a questo hack in contesti di codice più ampi: sembra che i lavoratori paralleli siano stati impostati per avere stati RNG quasi paralleli e future 'parfor' o altre chiamate DCT che non reimpostano il seed potrebbero avere stranezze risultati. Pre-generare i numeri casuali al di fuori del ciclo potrebbe essere più pulito se hai bisogno di riproducibilità totale. –
ho la situazione opposta. Potresti rispondere alla mia domanda: http: //stackoverflow.com/questions/40190243/matlab-generating-random-numbers-in-parfor-or-parallel-computing? Noredirect = 1 # comment67680730_40190243 – kyle