Посев в MATLAB с РНГ с парфо - PullRequest
0 голосов
/ 28 мая 2018

Предположим, у меня есть следующий код в MATLAB:

clc; clear;
myseed = rng(1);
c = 1; d = 2;
parfor i = 1:1000
   a = randn(200,1);
   b = randn(50,1);
   c*(sum(a)+sum(b));
end
parfor i = 1:1000
   a = randn(200,1);
   b = randn(50,1);
   d*(sum(a)+sum(b));
end

Третья строка в каждом цикле выше отражает обработку, которую я применяю к a и b, которая специфична для цикла ичто очень долго в моем реальном приложении.Причина повторения рандомизации a и b заключается в том, что я хотел бы поместить эти 2 цикла в 2 отдельных файла, которые я могу вызвать из основной программы.Я понимаю, что здесь есть некоторая неэффективность, но мне будет проще следовать коду.

Как использовать rng, поэтому a и b в одном цикле совпадают с aи b в другом цикле?(То есть 1000 «случайных» значений для a из первого цикла совпадают с 1000 «случайными» значениями для a из другого цикла. Они не обязательно должны быть в том же порядке.)Я попытался добавить rng(myseed) между 2 циклами, но это не помогло.

1 Ответ

0 голосов
/ 28 мая 2018

Я не часто использую parfor, но, похоже, работает следующий подход (адаптированный из здесь ):

parpool('local',4); % create parallel pool of workers
spmd
    rng(123); % set the same seed in each worker
end
parfor k = 1:12
    r = rand; % generate a random number
    w = getCurrentWorker;
    fprintf('Worker %i, iteration %i, random number %f\n', w.ProcessId, k, r)
end

Обратите внимание, как каждый работник генерирует одинаковые случайные числав том же порядке.(Итерации случайным образом назначаются работникам и выполняются в случайном порядке; это по проекту ).

Starting parallel pool (parpool) using the 'local' profile ...
connected to 4 workers.
Worker 11688, iteration 1, random number 0.275141
Worker 17188, iteration 2, random number 0.275141
Worker 18408, iteration 4, random number 0.275141
Worker 18408, iteration 3, random number 0.423046
Worker 5812, iteration 6, random number 0.275141
Worker 5812, iteration 5, random number 0.423046
Worker 11688, iteration 8, random number 0.423046
Worker 11688, iteration 7, random number 0.973406
Worker 17188, iteration 9, random number 0.423046
Worker 18408, iteration 10, random number 0.973406
Worker 5812, iteration 11, random number 0.973406
Worker 17188, iteration 12, random number 0.973406
...