複製可能な方法で数百万の乱数配列を生成する必要があります。配列は、OpenMPI に接続されたマシンのクラスター上に生成されます。各「タスク」には、数千のランダムな整数を含む独立した配列が必要です。
特定の実行を複製できるように、複数の実行を実行できるようにしたいと考えています。コードは現在 R にありますが、OpenMPI や R の仕様よりも、複数のマシンにまたがる並列 PRNG 生成の一般原則に関心があります。
理論的には、「マスター」ですべてのランダムなシリーズを生成し、シリーズ全体をタスクとともに「スレーブ」に送信できますが、これは扱いにくいと感じます。代わりに、タスクを受け取った後にスレーブでランダムなシリーズを生成したいと思います。
現在、マスターがスレーブ用の一連のシードを生成するために使用する、コマンド ラインで 1 つの乱数シードを提供しています。各タスクには、このストリームから順番に取得されたシードが割り当てられます。このシードは、タスクの詳細とともにスレーブに送信されます。
主人:
srand(commandLineArg)
runParameters = stuff
for (1 .. numTasks) {
slaveSeed = rand()
scheduleTask(slaveSeed, runParameters)
}
スレーブ:
srand(slaveSeed)
for n (1 .. numPoints) {
data[n] = rand()
}
return doStuff(data)
これは安全なアプローチですか?100 万のシードされたストリームから 1000 の乱数を読み取ることによって生成された 100 万のシリーズは、1 つのシードされたストリームから 1000 の数の 100 万のシリーズを順次読み取るのと同じくらい独立してランダムですか?
マスターに一連のランダムなスレーブ シードを生成させる必要がありますか、それともスレーブに単純なシリーズ (1..numTasks) を使用することも同様に効果的でしょうか? このステップが単なるシャレードである場合、誤った安心感を追加したくありません。
この方法で疑似ランダムサンプルを再現可能に生成するための確立されたベストプラクティスはありますか? SPRNG と L'Ecuyer のアプローチへの言及を見てきました。これらには、私が説明した方法よりも利点がありますか?
ありがとう!