Параллельные генераторы псевдослучайных чисел

20

Этот вопрос в первую очередь связан с практической проблемой разработки программного обеспечения, но мне было бы любопытно услышать, могли бы теоретики дать более глубокое понимание этого.


Проще говоря, у меня есть симуляция Монте-Карло, которая использует генератор псевдослучайных чисел, и я хотел бы распараллелить ее так, чтобы 1000 компьютеров параллельно выполняли одну и ту же симуляцию. Поэтому мне нужно 1000 независимых потоков псевдослучайных чисел.

Можем ли мы иметь 1000 параллельных потоков со следующими свойствами? Здесь должен быть очень известным и широко изученным PRNG со всеми видами хороших теоретических и эмпирических свойств.X

  1. Потоки, вероятно, так же хороши, как если бы я просто использовал и разделил поток, сгенерированный X, на 1000 потоков.XX

  2. Генерация следующего числа в любом потоке (почти) так быстро , как генерации следующего номера с .X

Иначе говоря: можем ли мы получить несколько независимых потоков «бесплатно»?

Конечно, если бы мы просто использовали , всегда отбрасывая 999 чисел и выбирая 1, то у нас наверняка было бы свойство 1, но мы потеряли бы во время выполнения в 1000 раз.X

Простая идея состоит в том, чтобы использовать 1000 копий с начальными числами 1, 2, ..., 1000. Это, безусловно, будет быстрым, но не очевидно, если потоки имеют хорошие статистические свойства.X


После некоторого поиска в Google я обнаружил, например, следующее:

  • Библиотека SPRNG, похоже, предназначена именно для этой цели и поддерживает несколько PRNG .

  • В наше время Mersenne Twister, кажется, является популярным PRNG, и я нашел несколько ссылок на вариант, который может генерировать несколько потоков параллельно.

Но все это так далеко от моих собственных областей исследований, что я не мог понять, что на самом деле является современным, и какие конструкции хорошо работают не только в теории, но и на практике.


Некоторые уточнения: мне не нужны никакие криптографические свойства; это для научных расчетов. Мне понадобятся миллиарды случайных чисел, поэтому мы можем забыть любой генератор с периодом .<232

Редактировать: я не могу использовать настоящий ГСЧ; Мне нужен детерминистический PRNG. Во-первых, это очень помогает при отладке и делает все воспроизводимым. Во-вторых, это позволяет мне, например, очень эффективно находить медиану, используя тот факт, что я могу использовать многоходовую модель (см. Этот вопрос ).

Редактировать 2: Есть тесно связанный вопрос @ StackOverflow: генератор псевдослучайных чисел для кластерной среды .

Юкка Суомела
источник
6
почему бы вам не использовать PRNG с независимо выбранными семенами? я не понимаю, как это не удовлетворяет 1 и 2, так как вам не требуется координация между различными машинами1000
Сашо Николов
Я не эксперт, но недавно (в поиске информации о вопросе TCS) я нашел это оборудование: idquantique.com/true-random-number-generator/… ... PCI-плата, которая может генерировать поток 16 Мбит / с (квантовые) случайные биты. ... вы можете купить их несколько и реализовать несколько серверов генераторов случайных чисел ... не очень хороший теоретический подход, но биты гарантированно будут "хорошими" :-) :-)
Marzio De Biasi
@Vor: Я хотел бы, чтобы все повторялось и детерминировано. Учитывая фиксированное начальное число, я хочу получить точно такой же результат, если перезапущу эксперимент. И я хочу иметь возможность провести один и тот же эксперимент на одной машине и снова получить те же результаты. (Во-первых, это очень помогает при отладке параллельных алгоритмов ...)
Юкка Суомела,
@Jukka: хорошо! ... и я полагаю, что хранение миллиардов разархивированных диких битов вместе с результатами эксперимента не так выполнимо :-) ... нужен эксперт по PRNG!
Марцио Де Биаси
2
Спасибо за ответы до сих пор! Давайте посмотрим, получим ли мы больше участия за вознаграждение ...
Юкка Суомела

Ответы:

7

Вы можете использовать эволюцию алгоритма Мерсенна Твистера, разработанного Сайто и Мацумото:

SIMD-ориентированный Fast Mersenne Twister (SFMT)

SFMT - это генератор регистров сдвига с линейной обратной связью (LFSR), который генерирует 128-битное псевдослучайное целое число за один шаг. SFMT разработан с учетом недавнего параллелизма современных процессоров, таких как многоступенчатый конвейер и инструкции SIMD (например, 128-битное целое число). Он поддерживает 32-разрядные и 64-разрядные целые числа, а также с плавающей запятой двойной точности в качестве выходных данных. SFMT намного быстрее, чем MT, на большинстве платформ. Улучшена не только скорость, но и размеры равнораспределений с точностью v-бита. Кроме того, восстановление из 0-избыточного исходного состояния происходит намного быстрее. См. Магистерскую диссертацию Муцуо Сайто для подробностей .

Период колеблется от до 2 216091 - 1 .2607-12216091-1

Использование одного и того же генератора псевдослучайных чисел для генерации нескольких независимых потоков путем изменения начальных значений может вызвать проблемы (с пренебрежимо малой вероятностью). Чтобы избежать проблемы, использование разных параметров для каждого поколения является предпочтительным. Этот метод называется динамическим созданием параметров МП.

В исходном коде SFMT вы можете найти несколько примеров наборов параметров (переменных периодов) и сценария awk для преобразования файла CSV в скомпилированный набор параметров. Существует также инструмент под названием « Динамическое создание генераторов Мерсенна Твистера ».

Недавно авторы разработали еще одну модифицированную версию Mersenne Twister - Mersenne Twister для графических процессоров - предназначенную для работы в графических процессорах и использования преимуществ собственных потоков параллельного выполнения. Ключевой особенностью является скорость: случайных целых чисел каждые 4,6 мс на GeForce GTX 260.5×107

Периоды сгенерированной последовательности составляют , 2 23209 - 1 и 2 44497 - 1211213122320912444971 для 32-разрядной версии и , 2 44497 - 1 , 2 110503 - 1 для 64-разрядной версии. Он поддерживает 128 наборов параметров для каждого периода, другими словами, он может генерировать 128 независимых последовательностей псевдослучайных чисел для каждого периода. Мы разработали Dynamic Creator для MTGP, который генерирует больше наборов параметров2232091244497121105031

Действительно, они предоставляют инструмент MTGPDC для создания до наборов параметров (т.е. независимых потоков).232

Алгоритм проходит основные тесты на случайность, такие как Diehard и NIST.

Предварительная статья также доступна по arXiv: вариант Mersenne Twister, подходящий для графических процессоров.

Марцио де Биаси
источник
Связанный, но более старый инструмент - Matsumoto и Nishimura (1998): Динамическое создание генераторов псевдослучайных чисел . Но я не смог выяснить, какие из этих инструментов являются просто доказательством концепции, а какие широко используются в отрасли программными пакетами.
Юкка Суомела
@Jukka: возможно, вы можете задать это непосредственно авторам алгоритма MTGP. С их сайта: "... Любые отзывы приветствуются (отправьте электронное письмо Муцуо Сайто, Сайто" на знак "math.sci.hiroshima-u.ac.jp и m-mat" на знак "math.sci.hiroshima- u.ac.jp) ... ". Возможно, они не могут быть на 100% беспристрастными, но они наверняка хорошо знают сильные и слабые стороны MTGP и могут сказать вам, подходит ли он для ваших целей.
Марцио Де Биаси
Кажется, что Mersenne Twister + Dynamic Creation - рекомендуемый способ сделать это в Mathematica.
Юкка Суомела
@Jukka: пакет MT + DC также можно найти на сайте Мацумото ( math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ); и я думаю, что MTGP - только вариант, подходящий для графических процессоров. Так что MT + DC кажется лучшим (и проверенным / стабильным) выбором (если только вам абсолютно не нужно случайных целых чисел каждые 4,6 мс в каждом потоке :-))))5×107
Марцио Де Биаси
@Vor: Если вы редактируете свой ответ и заменяете MTGP на dcmt , я могу принять его.
Юкка Суомела
12

Кажется, есть много способов решить эту проблему, но одним простым способом было бы использовать PRNG Blum Blum Shub . Этот PRNG определяется рекуррентным соотношением , где N - полупростая. Чтобы получить случайный бит из этого, вы можете просто взять битовую четность x i . Что хорошо в этом, так это то, что, поскольку x i + k = x 2 k i  mod  N = x 2 mod  N, вы можете напрямую рассчитать любой шаг постоянной времени вxi+1=xi2 mod NNxixi+k=xi2k mod N=xi2k mod λ(N)mod N (т.е. O ( log ( N ) 3 ) или быстрее) в зависимости от того, какой алгоритм умножения вы используете для модульной экспоненты). Таким образом, если у вас есть M машин, то для машины, индексированной y, вы можете использовать генератор x i + 1 , y = x 2 M mod  λ ( N ) i  mod  N , где x 0 , y = xkO(log(N)3)Myxi+1,y=xi2Mmod λ(N) mod N, гдеx0- ваше начальное число. Удобно, что это генерирует точно такой же поток чисел, как если бы вы использовали один поток и распределяли его выходные данные по каждой из машин по очереди.x0,y=x02y mod λ(N) mod Nx0

Однако это не самый быстрый из PRNG, поэтому он будет полезен только в том случае, если накладные расходы на то, что вы делаете в симуляции, значительно превышают стоимость PRNG. Однако стоит отметить, что для некоторых комбинаций и N это будет намного быстрее, чем для других, особенно если двоичное представление 2 MMN содержит несколько единиц или мало.2M mod λ(N)

Джо Фитцсимонс
источник
1
Я думаю, что было бы быстрее позволить каждой машине генерировать непрерывную часть последовательности, разнося их так далеко друг от друга, что они не будут пересекаться. В любом случае, использование Blum Blum Shub для не криптографических приложений кажется мне немного излишним.
Антонио Валерио Мицели-Бароне
1
@Antonio: Да, это было бы немного быстрее, особенно если вы заранее точно знаете, сколько испытаний вам нужно. Если вы не знаете, то я думаю, вы получите одинаковое масштабирование в любом случае. Жестокий Блюм Блюм Шуб был как раз тем PRNG, которым мы научились в вычислительной физике много лет назад. Если вы не используете его в криптографических целях, вы можете использовать гораздо меньший модуль, поэтому он не такой уж медленный, и для многих задач он будет быстрым по сравнению с любой функцией случайной величины, которую вам нужно вычислить.
Джо Фитцсимонс
5

Как насчет фазы предварительной обработки? Учитывая случайное начальное число (размера n ), запустите X, чтобы получить псевдослучайный поток размером 1000 n . Обозначим этот поток через s 1 , s 2 , , s 1000 , где для 1 i 1000 , s isnX1000ns1,s2,,s10001i1000sin

Эта фаза предварительной обработки может быть выполнена с очень низкими издержками, учитывая тот факт, что X

Теперь, отдавание как семя в IsiiX

Xs1i<j1000sisjs ); следовательно, этот подход не требует большой случайности или хранения.

М.С. Дусти
источник
Разве это не тот же самый подход, который предлагал @Antonio: используйте PRNG для генерации семян для себя. У меня немного неприятное чувство по этому поводу ... Чтобы дать тривиальный пример того, что может пойти не так, рассмотрим PRNG, где output = внутреннее состояние, а начальное число просто устанавливает внутреннее состояние.
Юкка Суомела
@Jukka: Мой подход похож на подход Антонио, но мой более общий. PRNG в вашем примере (где output = внутреннее состояние) не выглядит криптографически безопасным. PRNG криптографически безопасен, если его выходные данные в вычислительном отношении неотличимы от равномерного распределения. Смотрите это для получения дополнительной информации. PS: PRNG Blum-Blum-Shub удовлетворяет этому условию.
MS Dousti
2

fM=1000{0,1,,M1}jif(i+jM)M

Это даст вам криптографический ГСЧ для каждого процесса, но это не обязательно приведет к снижению производительности. AES работает быстро, если у вас есть оборудование, которое его поддерживает, и ChaCha работает быстро Конечно, вы хотите измерить это в ваших конкретных условиях, чтобы быть уверенным.

f

ч.р.ф.
источник
Если меня не волнует криптографическая стойкость, как ChaCha (счетчик) сравнивается, например, с Mersenne Twister? Это быстрее или медленнее? Имеет ли он хотя бы хорошие статистические свойства? Я пытался зайти в Google, но не смог найти ни одной статьи, которая бы сравнивала эти две статьи в некриптографическом контексте.
Юкка Суомела
2

Теперь есть функция перехода для SFMT (быстрая реализация Mersenne Twister).

Это позволяет мне инициализировать 1000 МТ, чтобы не было перекрытия циклов. И SFMT должен быть быстрее, чем MTGP. Почти идеально подходит для моих целей.

Юкка Суомела
источник
1

Вы можете просто использовать 1000 экземпляров Mersenne Twister, инициализированных различными семенами.

Вы можете попробовать семена из другого Mersenne Twister или, чтобы быть уверенным в их независимости, из генератора криптографических псевдослучайных чисел ОС (/ dev / urandom в Linux).

Mersenne Twister всегда работает с одной и той же циклической последовательностью, то есть с семенным контролем, с которого вы начинаете его генерировать. При независимой выборке семян каждый генератор запускается в разных, обычно очень дальних точках, с очень малой вероятностью пересечения.

Антонио Валерио Мицели-Бароне
источник
Таким образом, у MT есть некоторые хорошие специальные свойства, которые гарантируют, что посев MT с другим MT имеет смысл?
Юкка Суомела
MT имеет какие-либо доказуемые свойства псевдослучайности?
Сашо Николов
@Jukka: не тот, о котором я знаю. Вот почему я предложил использовать другой тип PRNG для посева, если вы особенно боитесь каких-то странных неизвестных корреляций.
Антонио Валерио Мицели-Бароне
@Sasho: страница в Википедии упоминает о k-распределении и большом периоде.
Антонио Валерио Мицели-Бароне
1
kk