2014-09-11 2 views
1

У меня есть цикл parfor для параллельных вычислений в Matlab. Я хочу иметь разные случайные числа при каждом вызове этих циклов parfor на 8 рабочих. Если я не использую функцию rng('shuffle'), у меня есть одно и то же случайное число для randperm(10). В этом случае мой код запускает rng('shuffle') функцию до randperm одновременно у всех работников. У меня разные случайные числа в этом состоянии? когда я вижу randperm выходы в парфоре, некоторые из этих выходов одинаковы!Использование функции rng ('shuffle') в параллельных вычислениях

Мне нужно сохранить rng до rng('shuffle') и использовать что-то подобное rng(saved_rng) после окончания параллельного цикла?

Мы имеем это в Matlab помощи:

Примечания Поскольку ГСЧ («перетасовать») семена генератора случайных чисел на основе на текущий момент времени, вы не должны использовать эту команду, чтобы установить случайный поток номера на разных работников, если вы хотите обеспечить независимые потоки . Это особенно актуально, когда команда отправляется одновременно нескольким работникам, например, внутри команды parfor, spmd или . Для независимых потоков для рабочих используйте поведение по умолчанию ; или если этого недостаточно для ваших нужд, рассмотрите возможность использования уникального субпотока для каждого работника.

Так что я должен делать? Имею ли я разные случайные числа, если я удалю rng? У меня есть две версии этих кодов. Один из них - расчет с parfor и другими с использованием цикла for. Могу ли я удалить shuffle из for? У меня разные случайные числа в этом состоянии?

Спасибо.

Ps.

Я могу иметь эти структуры:

parfor I=1:X 
xx = randperm(10) 
end 


parfor I=1:X 
rng('shuffle'); 
xx = randperm(10) 
end 

rng('shuffle'); 
parfor I=1:X 
xx = randperm(10) 
end 

Я хочу иметь различные случайные числа от randperm функции. Как я могу это сделать? для for Структура мне нужна shuffle функция (без него случайные числа совпадают), но когда я добавляю ее в parfor, некоторые случайные выходы randperm - то же самое!

+0

Почему вы используете 'rng ('shuffle')'? Что случилось с настройкой по умолчанию? Кроме того, можно ли переместить случайную генерацию до параллельной части? –

+0

Спасибо за ваш комментарий. Можно ли удалить 'rng ('shuffle')' в 'parfor'? Почему нам нужно 'random generation' перед' parfor loop'? – user2991243

+0

Это не делает меня более понятным для меня. Не могли бы вы включить упрощенную версию вашего кода, четко отображая проблему? –

ответ

1

Для этого вам необходимо выбрать алгоритм RNG, который поддерживает параллельные подпотоки (другими словами, вы можете разделить случайный поток на подпотоки, и каждый из подпотоков по-прежнему имеет правильные статистические свойства, которые вы хотите от случайный поток).

алгоритм ГСЧ по умолчанию (Вихрь Мерсенна, или mt19937ar) не поддерживает параллельные субпотоков, но MATLAB поддерживает два алгоритма, которые делают (мультипликативный отставал генератор Фибоначчи mlfg6331_64 и комбинированную несколько рекурсивный генератор mrg32k3a).

Например:

s = RandStream.create('mrg32k3a','NumStreams',4,'Seed','shuffle','CellOutput',true)

s теперь массив ячеек случайных чисел субпотоков.Все имеют одинаковое семя, и вы можете записать s{1}.Seed для воспроизведения, если хотите.

Теперь вы можете позвонить rand(s{1}) (или randn(s{1})) для генерации случайных чисел из потока 1 и т. Д. Сбросьте поток до его начальной конфигурации с помощью reset(s{1}), и вы должны обнаружить, что каждый поток воспроизводится отдельно.

Каждый работник может генерировать случайные числа таким образом, что по-прежнему статистически звук, и воспроизводимый даже параллельно:

parfor i = 1:4 
    rand(s{i}) 
end 

Для получения дополнительной информации, смотрите в документации по статистике Toolbox под Ускорить статистические вычисления. Здесь есть несколько статей, в которых вы найдете все сложные детали. Если у вас нет Статистического инструментария, документация находится на сайте MathWorks.

+0

Благодарим вас за ответ. Я где-то читал, что мне нужно только «randperm» в «parfor» без чего-либо еще. Из-за работы с рабочими у меня есть разные случайные числовые потоки с этим в каждом цикле 'parfor'. я могу сделать это? Если нет, то в чем проблема? – user2991243

+0

Вы можете использовать 'randperm (s {i})' для рабочих, а также 'rand',' randn' и 'randi'. –

+0

Почему мы не можем использовать 'randperm'? Помимо использования 'randperm', у меня есть инициализация веса нейронной сети с помощью функции' configure'. Что я должен делать по этому поводу и почему? Благодарю. – user2991243