並列擬似乱数ジェネレーター


20

この質問は主に実用的なソフトウェアエンジニアリングの問題に関連していますが、理論家がより多くの洞察を提供できるかどうか聞いてみたいです。


簡単に言えば、擬似乱数ジェネレーターを使用するモンテカルロシミュレーションがあり、同じシミュレーションを並列で実行する1000台のコンピューターがあるように並列化したいと思います。したがって、擬似乱数の1000個の独立したストリームが必要です。

次のプロパティを持つ1000個の並列ストリームを使用できますか?ここで、は、あらゆる種類の素晴らしい理論的および経験的特性を備えた、非常によく知られ、広く研究されているPRNGである必要があります。X

  1. ストリームは、私は単純に使用した場合になるだろうどのように良いと証明可能ですしてによって生成されたストリーム分割 1000個のストリームにします。XX

  2. ストリーム内の次の番号の生成は、て次の番号を生成するのと(ほぼ)同じくらい高速です。X

別の言い方をすれば、複数の独立したストリームを「無料で」取得できますか?

もちろん、常にを使用し、常に999個の数字を破棄して1を選択した場合、確かにプロパティ1が得られますが、実行時間で1000倍になります。X

単純なアイデアは、シード1、2、...、1000 で 1000コピーを使用することです。これは確かに高速になりますが、ストリームに良好な統計特性があるかどうかは明らかではありません。X


グーグルでいくつか調べた後、たとえば次のことがわかりました。

  • SPRNGのライブラリは、まさにこの目的のために設計されているように見える、それがサポートしている複数のPRNGを

  • メルセンヌツイスターは最近人気のあるPRNGのようで、複数のストリームを並行して生成できるバリアントへの参照をいくつか見つけました。

しかし、これはすべて私自身の研究領域からは程遠いため、実際に最先端のものがどれであるか、どの構造が理論上だけでなく実際にもうまく機能するかを理解できませんでした。


いくつかの明確化:暗号化プロパティは一切必要ありません。これは科学計算用です。数十億の乱数が必要になるので、周期がジェネレーターはすべて忘れてしまいます。<232

編集:私は真のRNGを使用できません。確定的なPRNGが必要です。第一に、それはデバッグに大いに役立ち、すべてを繰り返し可能にします。第二に、マルチパスモデルを使用できるという事実を利用することで、たとえば中央値検出を非常に効率的に行うことができます(この質問を参照)。

編集2:密接に関連する質問@ StackOverflowがあります:クラスタ環境用の擬似乱数ジェネレータ


6
なぜ個別にサンプリングされたシードでPRNGを使用しないのですか?私はあなたが異なるマシン間での調整を必要としないので、これは、1と2を満たしていないかを理解していない1000
Sashoニコロフ

私は専門家ではありませんが、最近(TCSの質問に関する情報を検索して)このハードウェアを見つけました: idquantique.com/true-random-number-generator/… ... (量子)ランダムビット。...あなたはそれらの束を購入し、いくつかの乱数ジェネレーターサーバーを実装することができます...素晴らしい理論的アプローチではありませんが、ビットは「良い」ことが保証されます:-) :-)
Marzio De Biasi

@Vor:すべてを再現性と決定性で維持したいと思います。固定のシードが与えられた場合、実験を再実行すると、まったく同じ結果が得られます。そして、1台のマシンで同じ実験を実行し、同じ結果を再び取得できるようにしたいと考えています。(1つは、並列アルゴリズムをデバッグするときに非常に役立ちます...)
Jukka Suomela

@Jukka:OK!...そして、実験結果とともに数十億個の解凍可能なワイルドビットを保存することはそれほど実現可能ではないと思います:-) ... PRNGの専門家が必要です!
マルツィオデビアシ

2
これまでの回答に感謝します!私たちは恵みと多くの参加を得ればレッツ見る
ユッカSuomela

回答:


7

斉藤と松本が開発したMersenne Twisterアルゴリズムの進化版を使用できます。

SIMD指向の高速メルセンヌツイスター(SFMT)

SFMTは、128ビットの擬似乱数整数を1ステップで生成する線形フィードバックシフトレジスタ(LFSR)ジェネレーターです。SFMTは、マルチステージパイプライン処理やSIMD(128ビット整数など)命令など、最近のCPUの最近の並列処理を使用して設計されています。32ビットおよび64ビット整数、および出力としての倍精度浮動小数点をサポートします。SFMTは、ほとんどのプラットフォームでMTよりもはるかに高速です。速度だけでなく、vビット精度での等分布の次元も改善されています。さらに、0超過の初期状態からの回復ははるかに高速です。詳細については、Sai藤Mu夫の修士論文を参照してください

期間から変動22607122160911

初期値を変更して複数の独立したストリームを生成するために1つの同じ疑似乱数ジェネレーターを使用すると、問題が発生する可能性があります(確率はごくわずかです)。この問題を回避するには、世代ごとに異なるパラメーターを使用することをお勧めします。この手法は、MTパラメーターの動的作成と呼ばれます。

SFMTソースコードには、(可変期間の)パラメーターセットの例と、CSVファイルをコンパイル可能なパラメーターセットに変換するawkスクリプトがあります。「Mersenne Twisterジェネレーターの動的作成」と呼ばれるツールもあります。

著者は最近、GPUで実行し、ネイティブの並列実行スレッドを利用するように設計されたMersenne Twisterの別の修正版- グラフィックプロセッサ向けMersenne Twisterを開発しました。主な機能は速度です:GeForce GTX 260では4.6msごとに 10 7個のランダムな整数。5×107

生成されたシーケンスの期間は、2 23209 - 1及び2 44497 - 1 32ビットバージョンの、及び2 23209 - 12 44497 - 12 110503 - 1 64ビットバージョンのために。期間ごとに128個のパラメータセットをサポートしています。つまり、期間ごとに128個の独立した擬似乱数列を生成できます。より多くのパラメーターセットを生成するMTGP用のDynamic Creatorを開発しました2112131223209124449712232091244497121105031

確かに彼らは提供MTGPDCツールをまで作成してパラメータセット(すなわち独立したストリーム)。232

このアルゴリズムは、ダイハードやNISTなどの主要なランダム性テストに合格します。

arXiv:グラフィックプロセッサに適したメルセンヌツイスターのバリアントに関する予備的な論文もあります。


関連する古いツールは、Matsumoto and Nishimura(1998):Dynamic Creation of Pseudorandom Number Generatorsです。しかし、これらのツールのどれが単なる概念実証であり、どのツールが業界で広く使用されているソフトウェアパッケージであるかを把握できていません。
ユッカスオメラ

@Jukka:たぶん、MTGPアルゴリズムの作者に直接尋ねることができます。彼らのサイトから: "...どんなフィードバックも歓迎します(斉藤Mu夫にメールを送り、saito" at sign "math.sci.hiroshima-u.ac.jpとm-mat" at sign "math.sci.hiroshima- u.ac.jp)...」。おそらく彼らは100%公平ではないかもしれませんが、MTGPの長所と短所を確実に知っており、あなたの目的に適しているかどうかを教えてくれます。
マルツィオデビアシ

そうですメルセンヌツイスター+動的な作成Mathematicaでそれを行うために推奨される方法であること。
ユッカスオメラ

@Jukka:MT + DCパッケージは、松本のサイト(math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html)にもあります。MTGPはGPUに適したバリアントに過ぎないと思います。したがって、MT + DCはより良い(そしてテスト済み/安定した)選択のようです(各ストリームで4.6msごとにランダムな整数が絶対に必要でない限り:5×107
Marzio De Biasi

@Vor:回答を編集してMTGPをdcmtに置き換えれば、私はそれを受け入れることができます。
ユッカスオメラ

12

この問題に取り組むには多くの方法があるようですが、1つの簡単な方法は、Blum Blum Shub PRNG を使用することです。このPRNGは、再帰関係で定義されます。ここで、Nは半素数です。これからランダムなビットを取得するには、x iのビットパリティを取得するだけです。これについての素晴らしいがあるためということです何のx I + K = X 2 K私は  国防省  N = X 2 k個 のmod  λ N Ixi+1=xi2 mod NNxiでは、 kの時定数の任意のステップを直接計算できます(つまり、 O log N 3またはモジュラー指数に使用する乗算アルゴリズムに応じて高速)。したがって、使用しているれている M個のマシンを、次いでによってインデックス付けマシンの Yあなたは発電機を使用することができ、X I + 1 Y = X 2 M のmod  λ Nを私は  国防省  N X 0 Y = Xxi+k=xi2k mod N=xi2k mod λ(N)mod NkO(log(N)3)Myxi+1,y=xi2Mmod λ(N) mod NX0はあなたの種子です。便利なことに、単一のストリームを使用し、その出力を各マシンに順番に配布した場合とまったく同じ数のストリームを生成します。x0,y=x02y mod λ(N) mod Nx0

ただし、これはPRNGの最速ではないため、シミュレーションで実行しているすべてのオーバーヘッドがPRNGのコストを大幅に上回る場合にのみ役立ちます。しかし、はるかに高速の特定の組み合わせのためになることを指摘する価値があるNのバイナリ表現場合は特に、他のものよりも2 M  のmod  λ Nは数1Sを含むか、または小さいです。MN2M mod λ(N)


1
各マシンにシーケンスの連続部分を生成させ、それらが交差しないように間隔を空けておくと、より高速になると思います。とにかく、暗号化されていないアプリケーションにBlum Blum Shubを使用するのはちょっとやり過ぎだと思います。
アントニオヴァレリオミチェリバローネ

1
@Antonio:はい、それは少し速くなります。特に、必要な試行回数を正確に事前に知っている場合はそうです。わからない場合は、どちらの方法でも同じスケーリングが得られると思います。Wierdly Blum Blum Shubは、数年前に計算物理学で教えられたPRNGでした。暗号化の目的で使用していない場合は、はるかに小さいモジュラスを使用できますので、それほど遅くはありません。多くのタスクでは、計算する必要があるランダム変数の関数と比較して高速です。
ジョーフィッツシモンズ

5

前処理フェーズはどうですか?(サイズnの)ランダムシード与えられたら、Xを実行してサイズ1000 nの擬似ランダムストリームを取得します。このストリーム示すS 1sは2... sは1000年のために、1 I 1000年sはiはサイズのストリームの連続する部分であるNをsnX1000ns1,s2,,s10001i1000sin

が効率的なPRNGであるという事実を考えると、この前処理フェーズは非常に低いオーバーヘッドで実行できます(今日、非常に高速なPRNGがあります)。X

siiX

Xs1i<j1000sisjs


これは本質的に@Antonioが提案したものと同じアプローチではありません。PRNGを使用してそれ自体のシードを生成します。私はこれについて少し不安を感じています...何が間違っているのかという些細な例を挙げるために、出力が内部状態で、シードが単に内部状態を設定するPRNGを考えてください。
ユッカスオメラ

@Jukka:私のアプローチはアントニオのアプローチに似ていますが、私の方がより一般的です。例のPRNG(出力=内部状態)は、暗号的に安全ではないようです。PRNGは、出力が均一な分布と計算上区別できない場合、暗号的に安全です。詳細はこちらをご覧ください。PS: Blum-Blum-Shub PRNGはこの条件を満たす。
MS Dousti

2

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

これにより、すべてのプロセスで暗号化されたRNGが提供されますが、必ずしもパフォーマンスコストが発生するとは限りません。AESは、それをサポートするハードウェアがあれば高速であり、ChaChaはそれでも高速です。もちろん、確実に特定の設定でこれを測定する必要があります。

f


暗号強度を気にしない場合、ChaCha(counter)は、たとえばMersenne Twisterと比較してどうですか?速いですか、遅いですか?少なくとも同等の統計特性を持っていますか?Googleで検索しようとしましたが、これら2つを非暗号化コンテキストで比較する記事を見つけることができませんでした。
ユッカスオメラ

2

今そこにあるジャンプ機能についてSFMT(高速メルセンヌツイスターの実装が)。

これにより、1000のMTを初期化できるため、サイクルの重複はありません。SFMTはMTGPよりも高速である必要があります。私の目的にはほぼ完璧です。


1

異なるシードで初期化されたMersenne Twisterのインスタンスを1000個だけ使用できます。

別のMersenne Twisterからシードをサンプリングするか、OSの暗号化擬似乱数ジェネレーター(Linuxの場合は/ dev / urandom)から確実に独立させることができます。

Mersenne Twisterは常に同じ循環シーケンスで動作し、シードは生成を開始する場所を制御します。シードを個別にサンプリングすると、各ジェネレーターは、交差する可能性が非常に低く、異なる、通常は非常に遠いポイントで開始します。


MTには、MTに別のMTをシードすることが理にかなっていることを保証するいくつかの特別なプロパティがありますか?
ユッカスオメラ

MTには、証明可能な擬似乱数性のプロパティがありますか?
サショニコロフ

@Jukka:私が知っているものではありません。そのため、奇妙な未知の相関関係を特に恐れている場合、シードに別のタイプのPRNGを使用することを提案しました。
アントニオヴァレリオミセリバローネ

@Sasho:ウィキペディアのページには、k分布と大きな期間が記載されています。
アントニオヴァレリオミチェリバローネ

1
これらの間接的な対策は私を困惑させます。PRNGに必要なのは長い期間であり、k-分布?私はそれを疑います; これらは単なるヒューリスティックな健全性チェックです。とは対照的k賢明な独立性は、実際には多くの設定で正確性を保証する擬似ランダムなプロパティです。また、あなたが2 PRNGのを組み合わせた場合でも、あなたは少なくとも、まだ少なくともヒューリスティック「ランダム」プロパティが保持することを示す必要があります
Sashoニコロフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.