5

各スレッドが同じ乱数シーケンスを生成する必要がある並列 Fortran90 コードがあります。

特定のシードに対して、プログラムを実行するたびに同じ結果を繰り返すことが完全にできないため、スレッドセーフではないように思われる乱数ジェネレーターがあります。

スレッドセーフな RNG のコードを探して、Web 全体を (ほぼ) サーフィンすることに失敗しました。誰かが私に(へのリンクを)1つのコードを提供できますか?

前もって感謝します!

4

8 に答える 8

6

Fortran90 用の優れた疑似乱数ジェネレーターは、 Intel Math Kernel Vector Statistical Libraryにあります。それらはスレッドセーフです。また、なぜスレッドセーフである必要があるのですか? 各スレッドに同じリストを取得させたい場合は、スレッドごとに同じシードを持つ新しい PRNG をインスタンス化します。

于 2009-03-02T13:59:35.463 に答える
3

ほとんどの再現可能な乱数ジェネレーターは、何らかの形で状態を必要とします。状態がなければ、彼らは次に来ることをすることができません。スレッドセーフであるためには、自分で状態を保持する方法が必要です(つまり、グローバルにすることはできません)。

于 2009-03-02T13:37:00.743 に答える
1

Mersenne Twister/MT19973のスレッドセーフなFortran90バージョンをコーディングしました。PRNGの状態は派生型(randomNumberSequence)で保存され、プロシージャを使用してジェネレータをシードするか、シーケンス内の次の要素を取得します。

http://code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/Code/RandomNumbersForMC.f95を参照してください

于 2010-03-06T04:08:58.253 に答える
1

乱数の同じストリームを生成するには、すべてのスレッドが必要であることを理解しています。

再現可能な数のストリームを生成し、非常に高速な、非常に優れた疑似乱数ジェネレーターはMT19937です。スレッドを生成する前にシードを生成することを確認してください。ただし、すべてのスレッドで MT の個別のインスタンスを生成します (MT スレッドのインスタンスをローカルにします)。そうすれば、すべての MT が同じ数のストリームを生成することが保証されます。

于 2009-03-02T16:23:10.313 に答える
0

代替案は次のようです。

  • ジェネレーターのシード値で同期オブジェクト (ミューテックスなど) を使用します。残念ながら、これはジェネレーターへのアクセス時にコードをシリアル化します
  • ジェネレーターでスレッド ローカル ストレージを使用して、各スレッドが独自のシードを取得するようにします。これにより、アプリで統計上の問題が発生する可能性があります。
  • プラットフォームが適切なアトミック操作をサポートしている場合は、シードでそれを使用します (ただし、おそらくサポートされません)。

あまり有望なリストではないことはわかっています。それに加えて、FORTRAN でそれらを実装する方法がわかりません!

于 2009-03-02T13:43:45.610 に答える