Generator nomor pseudorandom paralel

20

Pertanyaan ini terutama terkait dengan masalah rekayasa-perangkat lunak praktis, tetapi saya ingin tahu jika para ahli teori dapat memberikan wawasan lebih dalam.


Sederhananya, saya memiliki simulasi Monte Carlo yang menggunakan generator nomor pseudorandom, dan saya ingin memparalelkannya sehingga ada 1000 komputer yang menjalankan simulasi yang sama secara paralel. Karena itu saya perlu 1000 aliran angka pseudorandom independen.

Bisakah kita memiliki 1000 stream paralel dengan properti berikut? Di sini harus menjadi PRNG yang sangat terkenal dan dipelajari secara luas dengan semua jenis sifat teoritis dan empiris yang bagus.X

  1. Streaming terbukti sebaik apa yang akan saya dapatkan jika saya hanya menggunakan dan membagi aliran yang dihasilkan oleh X menjadi 1000 stream.XX

  2. Menghasilkan nomor berikutnya dalam aliran apapun (hampir) secepat menghasilkan nomor berikutnya dengan .X

Jika tidak, bisakah kita mendapatkan beberapa aliran independen "gratis"?

Tentu saja jika kita hanya menggunakan , selalu membuang angka 999 dan memilih 1, maka kita pasti akan memiliki properti 1, tetapi kita akan kalah dalam waktu berjalan dengan faktor 1000.X

Gagasan sederhana akan menggunakan 1000 salinan , dengan biji 1, 2, ..., 1000. Ini tentu akan cepat, tetapi tidak jelas apakah aliran memiliki sifat statistik yang baik.X


Setelah beberapa Googling, saya telah menemukan, misalnya, yang berikut:

  • The SPRNG perpustakaan tampaknya dirancang untuk persis tujuan ini, dan mendukung beberapa PRNGs .

  • Twister Mersenne tampaknya menjadi PRNG yang populer saat ini, dan saya menemukan beberapa referensi untuk varian yang mampu menghasilkan beberapa aliran secara paralel.

Tetapi semua ini sangat jauh dari bidang penelitian saya sendiri, sehingga saya tidak dapat menemukan apa yang benar-benar canggih, dan konstruksi mana yang bekerja dengan baik tidak hanya dalam teori tetapi juga dalam praktiknya.


Beberapa klarifikasi: Saya tidak memerlukan segala jenis properti kriptografi; ini untuk perhitungan ilmiah. Saya akan membutuhkan miliaran angka acak, sehingga kita bisa melupakan generator apa pun dengan periode .<232

Sunting: Saya tidak dapat menggunakan RNG sejati; Saya membutuhkan PRNG deterministik. Pertama, ini sangat membantu dengan debugging dan membuat semuanya berulang. Kedua, ini memungkinkan saya untuk melakukan, misalnya, mencari median sangat efisien dengan mengeksploitasi fakta bahwa saya dapat menggunakan model multi-pass (lihat pertanyaan ini ).

Sunting 2: Ada pertanyaan terkait erat @ StackOverflow: Pseudo-random number generator untuk lingkungan cluster .

Jukka Suomela
sumber
6
mengapa Anda tidak menggunakan PRNG dengan benih sampel independen? saya tidak mengerti bagaimana ini tidak memuaskan 1 dan 2, karena Anda tidak memerlukan koordinasi antara mesin yang berbeda1000
Sasho Nikolov
Saya bukan ahli, tetapi baru-baru ini (mencari informasi tentang pertanyaan TCS) saya menemukan perangkat keras ini: idquantique.com/true-random-number-generator/ ... ... papan PCI yang dapat menghasilkan aliran 16Mbits / detik dari (kuantum) bit acak. ... Anda dapat membeli banyak dari mereka dan mengimplementasikan beberapa server pembangkit angka acak ... bukan pendekatan teoretis yang bagus tetapi bitnya dijamin "baik" :-) :-)
Marzio De Biasi
@Vor: Saya ingin menjaga semuanya berulang dan deterministik. Diberikan seed tetap, saya ingin mendapatkan hasil yang persis sama jika saya menjalankan kembali percobaan. Dan saya ingin dapat menjalankan percobaan yang sama pada satu mesin dan sekali lagi mendapatkan hasil yang sama. (Untuk satu, itu sangat membantu ketika debugging algoritma paralel ...)
Jukka Suomela
@Jukka: ok! ... dan saya kira menyimpan miliaran bit liar yang tidak dapat di-zip bersamaan dengan hasil percobaan tidak begitu memungkinkan :-) ... diperlukan ahli PRNG!
Marzio De Biasi
2
Terima kasih atas jawabannya sejauh ini! Mari kita lihat apakah kita mendapat lebih banyak partisipasi dengan hadiah ...
Jukka Suomela

Jawaban:

7

Anda dapat menggunakan evolusi dari algoritma Mersenne Twister yang dikembangkan oleh Saito dan Matsumoto:

Fast Mersenne Twister (SFMT) yang berorientasi SIMD

SFMT adalah generator Linear Feedbacked Shift Register (LFSR) yang menghasilkan integer pseudorandom 128-bit pada satu langkah. SFMT dirancang dengan paralelisme terbaru dari CPU modern, seperti multi-stage pipelining dan instruksi SIMD (mis. 128-bit integer). Ini mendukung bilangan bulat 32-bit dan 64-bit, serta floating point presisi ganda sebagai output. SFMT jauh lebih cepat daripada MT, di sebagian besar platform. Tidak hanya kecepatan, tetapi juga dimensi kesetaraan pada presisi v-bit ditingkatkan. Selain itu, pemulihan dari kondisi awal 0-kelebihan jauh lebih cepat. Lihat Tesis Guru tentang Mutsuo Saito untuk detailnya .

Periode bervariasi dari hingga 2 216091 - 1 .2607122160911

Menggunakan satu generator nomor acak yang sama untuk menghasilkan beberapa aliran independen dengan mengubah nilai awal dapat menyebabkan masalah (dengan probabilitas sangat kecil). Untuk menghindari masalah, lebih baik menggunakan parameter yang berbeda untuk setiap generasi. Teknik ini disebut pembuatan dinamis dari parameter MT.

Dalam kode sumber SFMT Anda dapat menemukan beberapa contoh set parameter (periode variabel) dan skrip awk untuk mengonversi file CSV ke set parameter yang dapat dikompilasi. Ada juga alat yang disebut " Penciptaan Dinamis generator Mersenne Twister ".

Para penulis baru-baru ini mengembangkan versi modifikasi lain dari Mersenne Twister - Mersenne Twister untuk Prosesor Grafis - yang dirancang untuk berjalan dalam GPU dan memanfaatkan untaian eksekusi paralel asli mereka. Fitur utamanya adalah kecepatan: bilangan bulat acak setiap 4,6 ms pada GeForce GTX 260.5×107

Periode urutan yang dihasilkan adalah , 2 23209 - 1 dan 2 44497 - 1 untuk versi 32-bit, dan 2 23209 - 1 , 2 44497 - 1 , 2 110503 - 1 untuk versi 64-bit. Ini mendukung 128 set parameter untuk setiap periode, dengan kata lain, dapat menghasilkan 128 urutan nomor pseudorandom independen untuk setiap periode. Kami telah mengembangkan Pencipta Dinamis untuk MTGP, yang menghasilkan lebih banyak set parameter2112131223209124449712232091244497121105031

Memang mereka menyediakan alat MTGPDC untuk membuat hingga set parameter (yaitu aliran independen).232

Algoritma melewati tes keacakan utama seperti Diehard dan NIST.

Makalah pendahuluan juga tersedia di arXiv: Varian Mersenne Twister yang Cocok untuk Prosesor Grafis

Marzio De Biasi
sumber
Alat yang terkait tetapi lebih lama adalah Matsumoto dan Nishimura (1998): Penciptaan Dinamis dari Generator Nomor Pseudorandom . Tetapi saya belum dapat menemukan alat mana yang hanya merupakan bukti konsep dan paket perangkat lunak kekuatan industri yang banyak digunakan.
Jukka Suomela
@Jukka: mungkin Anda bisa menanyakannya langsung ke penulis algoritma MTGP. Dari situs mereka: "... Setiap umpan balik diterima (kirim email ke Mutsuo Saito, saito" at sign "math.sci.hiroshima-u.ac.jp dan m-mat" at sign "math.sci.hiroshima- u.ac.jp) ... ". Mungkin mereka mungkin tidak 100% tidak memihak, tetapi mereka pasti tahu betul poin kuat dan lemah MTGP, dan dapat memberi tahu Anda apakah itu cocok untuk tujuan Anda.
Marzio De Biasi
Tampaknya Mersenne Twister + Dynamic Creation adalah cara yang disarankan untuk melakukannya di Mathematica.
Jukka Suomela
@Jukka: Paket MT + DC dapat ditemukan di situs Matsumoto juga ( math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html ); dan saya pikir MTGP hanya varian yang cocok untuk GPU. Jadi MT + DC tampaknya pilihan yang lebih baik (dan diuji / stabil) (kecuali jika Anda benar-benar membutuhkan bilangan bulat acak setiap 4,6 ms pada setiap aliran :-))))5×107
Marzio De Biasi
@Vor: Jika Anda mengedit jawaban Anda dan mengganti MTGP dengan dcmt , saya bisa menerimanya.
Jukka Suomela
12

xi+1=xi2 mod NNxixi+k=xi2k mod N=xi2k mod λ(N)mod NkO(log(N)3)Myxi+1,y=xi2Mmod λ(N) mod Nx0,y=x02y mod λ(N) mod Nx0

MN2M mod λ(N)

Joe Fitzsimons
sumber
1
Saya pikir akan lebih cepat untuk membiarkan setiap mesin menghasilkan bagian yang berdekatan dari urutan, jarak mereka begitu jauh sehingga mereka tidak akan berpotongan. Bagaimanapun, menggunakan Blum Blum Shub untuk aplikasi non-kriptografis bagi saya agak berlebihan.
Antonio Valerio Miceli-Barone
1
@Antonio: Ya, itu akan sedikit lebih cepat, terutama jika Anda tahu sebelumnya berapa banyak cobaan yang Anda butuhkan. Jika Anda tidak tahu, maka saya pikir Anda juga akan mendapatkan skala yang sama. Wierdly Blum Blum Shub adalah persis seperti PRNG yang kami duga dalam fisika komputasi bertahun-tahun yang lalu. Jika Anda tidak menggunakannya untuk keperluan kriptografi, Anda dapat menggunakan modulus yang jauh lebih kecil, sehingga tidak terlalu lambat, dan untuk banyak tugas, itu akan lebih cepat dibandingkan dengan fungsi variabel acak apa pun yang perlu Anda hitung.
Joe Fitzsimons
5

snX1000ns1,s2,,s10001i1000sin

X

siiX

Xs1i<j1000sisjs

MS Dousti
sumber
Bukankah ini pada dasarnya pendekatan yang sama dengan apa yang disarankan @Antonio: gunakan PRNG untuk menghasilkan benih untuk dirinya sendiri. Saya memiliki sedikit perasaan gelisah tentang ini ... Untuk memberikan contoh sepele tentang apa yang mungkin salah, pertimbangkan PRNG di mana output = keadaan internal dan seed hanya menetapkan keadaan internal.
Jukka Suomela
@Jukka: Pendekatan saya mirip dengan Antonio, tetapi pendekatan saya lebih umum. PRNG dalam contoh Anda (di mana output = keadaan internal) tampaknya tidak aman secara kriptografis. PRNG aman secara kriptografis jika hasilnya tidak dapat dibedakan secara komputasional dari distribusi yang seragam. Lihat ini untuk info lebih lanjut. PS: The Blum-Blum-Shub PRNG memenuhi kondisi ini.
MS Dousti
2

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

Ini akan memberi Anda RNG kriptografi pada setiap proses, tetapi itu tidak harus datang dengan biaya kinerja. AES cepat jika Anda memiliki perangkat keras yang mendukungnya, dan ChaCha cepat terlepas. Tentu saja, Anda ingin mengukur ini di pengaturan spesifik Anda untuk memastikan.

f

prf
sumber
Jika saya tidak peduli dengan kekuatan kriptografi, bagaimana ChaCha (counter) dibandingkan dengan, misalnya, Mersenne Twister? Apakah lebih cepat atau lebih lambat? Apakah setidaknya memiliki sifat statistik yang sama baiknya? Saya mencoba google, tetapi gagal menemukan artikel yang membandingkan keduanya dalam konteks non-kriptografi.
Jukka Suomela
2

Sekarang ada fungsi lompatan untuk SFMT (implementasi Mersenne Twister yang cepat).

Ini memungkinkan saya untuk menginisialisasi 1000 MTs sehingga tidak ada siklus yang tumpang tindih. Dan SFMT harus lebih cepat dari MTGP. Hampir sempurna untuk tujuan saya.

Jukka Suomela
sumber
1

Anda bisa menggunakan 1000 instance dari Mersenne Twister yang diinisialisasi dengan biji yang berbeda.

Anda dapat mencicipi benih dari Mersenne Twister lain, atau, untuk memastikan independensi mereka, dari OS pseudorandom number generator OS (/ dev / urandom di Linux).

Mersenne Twister selalu beroperasi pada urutan siklik yang sama, seed mengontrol di mana Anda mulai membuatnya. Dengan benih yang diambil secara terpisah, masing-masing generator akan mulai pada titik yang berbeda, biasanya sangat jauh, dengan kemungkinan persimpangan yang sangat kecil.

Antonio Valerio Miceli-Barone
sumber
Jadi MT memiliki beberapa sifat khusus yang bagus yang menjamin bahwa menabur MT dengan MT lain masuk akal?
Jukka Suomela
apakah MT memiliki sifat pseudorandomness yang dapat dibuktikan?
Sasho Nikolov
@ Jukka: tidak ada yang saya sadari. Itu sebabnya saya menyarankan untuk menggunakan jenis PRNG lain untuk penyemaian jika Anda terutama takut pada beberapa jenis korelasi aneh yang tidak diketahui.
Antonio Valerio Miceli-Barone
@Sasho: halaman Wikipedia menyebutkan distribusi k dan periode besar.
Antonio Valerio Miceli-Barone
1
kk