2009-03-02 23 views
5

私は、各スレッドが同じ乱数シーケンスを生成する必要があるいくつかの並列Fortran90コードを持っています。スレッドセーフ一様乱数ジェネレータ

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

スレッドセーフなRNGのコードを探して(ほとんど)ウェブ全体をサーフィンしませんでした。誰かに私のコードを渡すことができますか?

ありがとうございます!

+0

@Eric:Nice rewrite。 – dmckee

+0

アプリケーションはどのように並列化されていますか? MPIのようなものを使用している場合は、これを別の方法で処理することができます。 –

+0

これまではOpenMPを使用して並列化されていましたが、近い将来MPI – Bellman

答えて

6

Intel Math Kernel Vector Statistical Libraryには、Pseudorandom number generatorのFortran90があります。スレッドセーフです。また、なぜスレッドセーフである必要がありますか?各スレッドに同じリストを取得させたい場合は、同じシードのスレッドごとに新しいPRNGをインスタンス化します。あなたが言う

3

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

0

選択肢があるように見える:

  • は、ジェネレータのシード 値(例えば ミューテックスなど)の同期オブジェクトを使用します。お使いのプラットフォームがサポートしている場合、このアプリ
  • ためstatstical 問題を引き起こす可能性があり - これは、残念ながら
  • 発電機で
  • 使用スレッドローカルストレージはので、各スレッドは、独自の シードを取得し 発電機へのアクセスにコードをシリアライズします適し アトミック操作、 シード(それはおそらくないでしょう、しかし)

ない非常に励みリストにそれを使用し、私が知っています。そしてそれに加えて、私はどのようにFORTRANでそれらのどれを実装するか分かりません!

+0

Bahを使用して並列化します。 Fortran 90はCよりも劣っていません。 –

+0

私は知っています - FORTRAN IVは私の最初の言語でした。私は、「個人的に」現代のfortranにそれらを実装する方法を知らないことを意味しました。 –

2

は「乱数の同じシーケンスを生成する必要がある」あなたが

  • 各スレッドが他のスレッドと同じ数のストリームを生成する必要があることを意味するのですか? これは、スレッドを剥がす前にシードを選択してから、同じシードの各スレッドでスレッドローカルPRNGをインスタンス化することを意味します。

または

  • あなたは、プログラムの異なる実行間の数字の同じシーケンスを繰り返すことができるようにしたいが、各スレッドはそれ自身の独立したシーケンスを生成? この場合、スレッド操作シーケンスが非決定的であるため、単一のPRNGを共有することはできません。したがって、スレッドを起動する前に、既知のシードを持つ単一のPRNGをシードし、それを使ってスレッドの初期シードを生成します。 あなたは各スレッドでスレッドローカルジェネレータをインスタンス化します...あなたは統計について言うNeil Butterworth何に注意すべきであるこれらのケースのそれぞれにおいて

は:ミックスストリームは、このように生成されたときにPRNGが主張したいのが普通保証のほとんどは信頼性がありません。


いずれの場合も、スレッドローカルPRNGが必要です。私はf90で何が利用できるのかわかりません...しかしあなたは自分自身を書くこともできます(参照Mersenne Twisterを参照し、保存された状態をパラメータとして取るルー...を書く...)。 FORTRAN 77で

、これは

 function PRNGthread (state) 

     double state(statesize) 

c stuff happens here which uses and manipulates the state vector... 

     PRNGthread = result 
     return 

ようになり、すべてが同じ初期値を使用するでしょうが、あなたのスレッドのそれぞれは、別々の状態ベクトルを維持する必要があります。

1

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

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

1

SPRNG?私はそれを自分で試していない。

関連する問題