czuję potrzebę opracowania na ten temat. Nie resetuj nasion w pętli parfor
, a ponadto nie używaj równolegle algorytmu Twister Mersenne (otrzymasz słabe wyniki statystycznej niezależności).
Powodem uzyskania różnych wyników jest to, że algorytm jest inny z powodu właściwości statystycznych, które te liczby powinny utrzymać. W równoległej puli MATLAB ustawi algorytm na 'combRecursive' i ustawi inny podstrum na każdym z robotów, więc dla liczb losowych jesteś dobry. Ponadto, pętla parfor
nie gwarantuje —
- Kolejność, w jakiej pętle postępować,
- których pracownicy będą wykonujący każdy kawałek lub
- ilu iteracji wykonywane są na każdego pracownika.
Dlatego generowanie liczb losowych w pętlach parfor nie zwróci zwykle tych samych liczb losowych, nawet w tym samym stanie na każdym z nich. Zamiast zrobić RandStream ze strumieni algorytmu combRecursive ustawić globalny strumień na każdego pracownika w sPmd bloku, a następnie generować numery na każdego pracownika w sPmd bloku:
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{:}]';
Interesujące. Nie mogę znaleźć zmiany domyślnego generatora wymienionego gdziekolwiek w dokumentacji. Czy wiesz, czy wpływa to również na 'rand' i' randn'? Przy okazji, możesz zaakceptować własną odpowiedź na swoje pytanie. – horchler
+1 Bardzo interesujące. Bądź ostrożny z tym hackerem w większych kontekstach kodu - wygląda na to, że równolegli robotnicy mają teraz ustawione prawie równoległe stany RNG, a przyszłe 'parfor' lub inne wywołania DCT, które nie ustawiają ponownie nasion mogą mieć dziwne wyniki. Wstępne generowanie liczb losowych poza pętlą może być czystsze, jeśli potrzebujesz całkowitej powtarzalności. –
Mam przeciwną sytuację. Czy mógłbyś odpowiedzieć na moje pytanie: http: //stackoverflow.com/questions/40190243/matlab-generating-random-numbers-in-parfor-or-parallel-computing? Noredirect = 1 # comment67680730_40190243 – kyle