Генератори паралельних псевдовипадкових чисел


20

Це питання в першу чергу пов'язане з практичною інженерно-технічною проблемою, але мені було б цікаво почути, якби теоретики могли б детальніше зрозуміти її.


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

Чи можемо мати 1000 паралельних потоків із наступними властивостями? Тут X повинен бути дуже відомим і широко вивченим PRNG з усілякими приємними теоретичними та емпіричними властивостями.

  1. Потоки є настільки ж хорошими, як і те, що я отримав, якби просто використав X і розділив потік, породжений X на 1000 потоків.

  2. Генерація наступного числа в будь-якому потоці (майже) так швидко , як генерації наступного номера з X .

Інакше кажучи: чи можемо ми отримати кілька незалежних потоків "безкоштовно"?

Звичайно, якби ми просто використовували X , завжди відкидаючи 999 чисел і вибираючи 1, ми, безумовно, мали б властивість 1, але ми втратимо час роботи на коефіцієнт 1000.

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


Після деяких гуглів я виявив, наприклад, таке:

  • SPRNG бібліотека , здається, призначена саме для цієї мети, і вона підтримує декілька PRNGs .

  • Твістер Mersenne, здається, популярний PRNG в даний час, і я знайшов деякі посилання на варіант, який здатний паралельно виробляти кілька потоків.

Але все це настільки далеко від моїх власних дослідницьких областей, що я не міг зрозуміти, що насправді є найсучаснішим, і які конструкції добре працюють не тільки в теорії, але і на практиці.


Деякі роз’яснення: мені не потрібні якісь криптографічні властивості; це для наукових обчислень. Мені знадобляться мільярди випадкових чисел, щоб ми могли забути будь-який генератор з періодом <232 .

Редагувати: я не можу використовувати справжній RNG; Мені потрібен детермінований PRNG. По-перше, це дуже допомагає при налагодженні і робить все повторюваним. По-друге, це дозволяє мені, наприклад, робити медіану дуже ефективно, використовуючи той факт, що я можу використовувати багатопрохідну модель (див. Це питання ).

Редагувати 2: Існує тісно пов'язане питання @ StackOverflow: Псевдовипадковий генератор чисел для кластерного середовища .


6
чому б ти не використовував PRNG з незалежно відібраних насіння? я не розумію, як це не задовольняє 1 та 2, оскільки вам не потрібна координація між різними машинами1000
Сашо Ніколов

Я не фахівець, але останнім часом (шукаючи інформацію про питання про TCS) я знайшов таке обладнання: idquantique.com/true-random-number-generator/… ... плата PCI, яка може генерувати 16Mbit / сек потік (квантові) випадкові біти. ... ви можете придбати купу їх і реалізувати кілька серверів генераторів випадкових чисел ... не чудовий теоретичний підхід, але біти гарантовано є "хорошими" :-) :-)
Marzio De Biasi

@ Vor: Я хотів би зберегти все повторюваність та детермінованість. Давши зафіксований насіння, я хочу отримати точно такий же результат, якщо повторно проведу експеримент. І я хочу мати можливість провести той же експеримент на одній машині і знову отримати ті ж результати. (Для одного це дуже допомагає при налагодженні паралельних алгоритмів ...)
Юкка Суомела

@Jukka: гаразд! ... і я вважаю, що зберігати мільярди нерозбірних диких бітів разом з результатами експерименту не так вже й можливо :-) ... експерт PRNG потрібен!
Marzio De Biasi

2
Дякуємо за відповіді поки що! Давайте подивимось, чи отримаємо ми більше участі у нагороді ...
Jukka Suomela

Відповіді:


7

Ви можете використовувати еволюцію алгоритму Mersenne Twister, розробленого Сайто та Мацумото:

Швидкий Mersenne Twister, орієнтований на SIMD (SFMT)

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

Період коливається від до 2 216091 - 12607122160911 .

Використання одного і того ж генератора песудових випадкових чисел для генерації декількох незалежних потоків шляхом зміни початкових значень може спричинити проблему (з незначно малою ймовірністю). Щоб уникнути проблеми, краще використовувати різні параметри для кожного покоління. Ця методика називається динамічним створенням параметрів МТ.

У вихідному коді SFMT ви можете знайти деякі приклади наборів параметрів (змінних періодів) та сценарій awk для перетворення CSV-файлу в набір параметрів, що можна компілювати. Існує також інструмент під назвою " Динамічне створення генераторів Mersenne Twister ".

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

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

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

Алгоритм проходить основні тести на випадковість, такі як Diehard та NIST.

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


Спорідненим, але старшим інструментом є Мацумото і Нішимура (1998): Динамічне створення генераторів псевдовипадкових чисел . Але я не зміг зрозуміти, який із цих інструментів є лише доказом концепції, а які - широко використовувані галузеві програмні пакети.
Jukka Suomela

@Jukka: можливо, ви можете запитати це безпосередньо авторам алгоритму MTGP. З їхнього сайту: "... Будь-який відгук вітається (надішліть електронний лист Mutsuo Saito, saito" на знак "math.sci.hiroshima-u.ac.jp та m-mat" підпишіть "math.sci.hiroshima- u.ac.jp) ... ". Можливо, вони не можуть бути на 100% неупередженими, але вони, безумовно, добре знають сильні та слабкі місця MTGP, і можуть сказати вам, чи може це підходити для ваших покупців.
Marzio De Biasi

Здається, що Mersenne Twister + Dynamic Creation - це рекомендований спосіб зробити це в Mathematica.
Jukka Suomela

@Jukka: пакет MT + DC також можна знайти на сайті Мацумото ( math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ); і я думаю, що MTGP - це лише варіант, який підходить для GPU. Тож MT + DC здається кращим (і перевіреним / стабільним) вибором (якщо вам абсолютно не потрібно випадкових цілих чисел кожні 4,6 мс на кожному потоці :-))))5×107
Marzio De Biasi

@Vor: Якщо ви відредагуєте свою відповідь і заміните MTGP на dcmt , я можу прийняти її.
Jukka Suomela

12

Здається, існує багато способів вирішити цю проблему, але одним із простих способів було б використання PRNG Blum Blum Shub. Цей PRNG визначається відношенням рецидивування , де N є напівприміром. Щоб отримати випадковий біт з цього ви можете просто взяти бітну паритетність x i . Приємно в цьому, що оскільки x i + k = x 2 k i  mod  N = x 2 k  mod  λ ( N ) ixi+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 M  mod  λMN містить мало 1s або мало.2M mod λ(N)


1
Я думаю, що було б швидше дозволити кожній машині генерувати суміжну частину послідовності, розташовуючи їх так далеко один від одного, що вони не будуть перетинатися. У будь-якому випадку, використання Blum Blum Shub для некриптографічних додатків здається мені трохи надмірним.
Антоніо Валеріо Міцелі-Бароне

1
@Antonio: Так, це буде трохи швидше, особливо якщо ви заздалегідь знаєте, скільки випробувань вам потрібно. Якщо ви не знаєте, то я думаю, ви отримаєте те саме масштабування в будь-якому випадку. Wierdly Blum Blum Shub був саме PRNG, до якого ми були піддані обчислювальній фізиці років тому. Якщо ви не використовуєте його для криптографічних цілей, ви можете використовувати набагато менший модуль, тому це насправді не так повільно, і для багатьох завдань це буде швидко порівняно з будь-якою функцією випадкової величини, яку вам потрібно обчислити.
Joe Fitzsimons

5

Як щодо фази попередньої обробки? З огляду на випадкове насіння (розміром n ), запустіть X, щоб отримати псевдовипадковий потік розміром 1000 n . Позначимо цей потік на s 1 , s 2 , , s 1000 , де для 1 i 1000 , s isnX1000ns1,s2,,s10001i1000si - суміжна частина потоку розміром .n

Цю фазу попередньої обробки можна здійснити з дуже низькими накладними витратами, враховуючи той факт є ефективним PRNG (сьогодні ми маємо дуже швидкі PRNG).X

Тепер давайте як насіння i- й машині, яка використовує X для створення власного псевдослучайного потоку.siiX

З огляду на хороші властивості , якщо s не відомо, для будь-яких 1 i < j 1000 , насіння s i та s j обчислювально незалежні. Більше того, вам потрібно створити і зберегти лише одне невелике насіння (тобто s ); отже, цей підхід не потребує великої кількості справжньої випадковості чи зберігання.Xs1i<j1000sisjs


Це, по суті, не той самий підхід, як запропонований @Antonio: використовуйте PRNG, щоб генерувати насіння для себе. У мене є трохи непросто почуття з цього приводу ... Щоб навести тривіальний приклад того, що може піти не так, розгляньте PRNG, де вихід = внутрішній стан, а насіння просто встановлює внутрішній стан.
Jukka Suomela

@Jukka: Мій підхід схожий на Антоніо, але мій більш загальний. PRNG у вашому прикладі (де вихід = внутрішній стан) не здається криптографічно захищеним. PRNG є криптографічно безпечним, якщо його вихід обчислювально не відрізняється від рівномірного розподілу. Дивіться це для отримання додаткової інформації. PS: PRNG Blum-Blum-Shub задовольняє цій умові.
MS Dousti

2

Ви можете використовувати псевдовипадкову функцію наприклад AES або ChaCha, за допомогою одного випадкового ключа, шифруючи лічильник. Призначте кожному з M = 1000 паралельних процесів унікальне початкове значення в { 0 , 1 , , M - 1 } , а потім обчисліть j- й випадковий блок біт для процесу i як f ( i + j M ) , тобто з збільшенням лічильник у кожному процесі по M для кожного наступного блоку випадкових бітів.fM=1000{0,1,,M1}jif(i+jM)M

Це дасть вам криптографічну RNG за кожним процесом, але це не обов'язково приводить до вартості продуктивності. AES швидкий, якщо у вас є обладнання, яке його підтримує, а ChaCha швидкий незалежно. Звичайно, ви хочете виміряти це у ваших конкретних умовах, щоб бути впевненим.

Обидві бажані властивості 1 і 2 цим задовольняються безпосередньо. Крім того, зручніше, що поведінка всієї системи паралельних завдань контролюється одним "насінням" (клавіша для ).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 має сенс?
Юкка Суомела

чи має МТ якісь доказові властивості псевдовипадковості?
Сашо Ніколов

@Jukka: не будь-який я знаю. Ось чому я запропонував використовувати інший тип PRNG для висіву насіння, якщо ви особливо боїтесь якихось дивних невідомих типів кореляцій.
Антоніо Валеріо Міцелі-Бароне

@Sasho: на сторінці Вікіпедії згадується k-розподіл та великий період.
Антоніо Валеріо Міцелі-Бароне

1
ці непрямі заходи мене бентежать; чи колись так буває, що все, що потрібно від PRNG, - це великий період ік-розподіл? я сумніваюсь у цьому; це лише евристичні перевірки обгрунтованості; контраст зк-не незалежність, яка насправді є псевдовипадковою властивістю, що гарантує точність у багатьох налаштуваннях. Крім того, навіть якщо ви поєднаєте два PRNG, ви, принаймні, все одно повинні показати, що принаймні евристичні властивості "випадковості" мають місце
Сашо Ніколов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.