私は、各スレッドが同じ乱数シーケンスを生成する必要があるいくつかの並列Fortran90コードを持っています。スレッドセーフ一様乱数ジェネレータ
与えられたシードに対して、プログラムを実行するたびに同じ結果を繰り返すことができないため、スレッドセーフであると思われる乱数ジェネレータがあります。
スレッドセーフなRNGのコードを探して(ほとんど)ウェブ全体をサーフィンしませんでした。誰かに私のコードを渡すことができますか?
ありがとうございます!
私は、各スレッドが同じ乱数シーケンスを生成する必要があるいくつかの並列Fortran90コードを持っています。スレッドセーフ一様乱数ジェネレータ
与えられたシードに対して、プログラムを実行するたびに同じ結果を繰り返すことができないため、スレッドセーフであると思われる乱数ジェネレータがあります。
スレッドセーフなRNGのコードを探して(ほとんど)ウェブ全体をサーフィンしませんでした。誰かに私のコードを渡すことができますか?
ありがとうございます!
Intel Math Kernel Vector Statistical Libraryには、Pseudorandom number generatorのFortran90があります。スレッドセーフです。また、なぜスレッドセーフである必要がありますか?各スレッドに同じリストを取得させたい場合は、同じシードのスレッドごとに新しいPRNGをインスタンス化します。あなたが言う
ほとんどの反復可能乱数ジェネレータは、何らかの形で状態を必要とします。国家がなければ、彼らは次に来ることはできません。スレッドセーフであるためには、自分自身で状態を保持する方法が必要です(つまり、グローバルにすることはできません)。
選択肢があるように見える:
ない非常に励みリストにそれを使用し、私が知っています。そしてそれに加えて、私はどのようにFORTRANでそれらのどれを実装するか分かりません!
Bahを使用して並列化します。 Fortran 90はCよりも劣っていません。 –
私は知っています - FORTRAN IVは私の最初の言語でした。私は、「個人的に」現代のfortranにそれらを実装する方法を知らないことを意味しました。 –
は「乱数の同じシーケンスを生成する必要がある」あなたが
または
は:ミックスストリームは、このように生成されたときに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
ようになり、すべてが同じ初期値を使用するでしょうが、あなたのスレッドのそれぞれは、別々の状態ベクトルを維持する必要があります。
乱数の同じストリームを生成するには、すべてのスレッドが必要であることを理解しています。
非常に良い擬似ランダムジェネレータは、再生可能な数値のストリームを生成し、非常に高速です。MT19937です。スレッドを生成する前にシードを生成し、すべてのスレッドでMTのインスタンスを個別に生成してください(MTスレッドのインスタンスをローカルにする)。そうすれば、すべてのMTが同じ番号のストリームを生成することが保証されます。
約SPRNG?私はそれを自分で試していない。
スレッドセーフなFortran 90バージョンのMersenne Twister/MT19973をコード化しました。 PRNGの状態は派生型(randomNumberSequence)に保存され、プロシージャを使用してジェネレータをシードしたり、シーケンス内の次の要素を取得したりします。
http://code.google.com/p/i3rc-monte-carlo-model/source/browse/trunk/Code/RandomNumbersForMC.f95
@Eric:Nice rewrite。 – dmckee
アプリケーションはどのように並列化されていますか? MPIのようなものを使用している場合は、これを別の方法で処理することができます。 –
これまではOpenMPを使用して並列化されていましたが、近い将来MPI – Bellman