2016-09-08 13 views
1

私は、MPIコードでFortran組み込みPRNGを使用しようとしています。^1024年2の期間があるfortran RANDOM_SEEDを並列で使用するMPI

のgfortranがxorshift1024使ってPRNGを実装し、私はこの linkから理解

* - 1.それはまた言う:マルチスレッドプログラム(例えばでのOpenMPを使用していること

注意ディレクティブ)、 各スレッドは独自の乱数状態を持ちます。

その後thisを読んで、私が見つかりました:

新しいスレッドが初めて RANDOM_NUMBERを使用して、シードはマスター 種子からコピーされ、保証にN * 2^512段階に転送されますランダム ストリームは、Nが プログラム実行

0時これまでRANDOM_NUMBERを使用しているスレッドの 数であるシステム内の他のストリームを別名ないこと

これがGFortranの自動機能であれば、OpenMPでのみ動作しますか? MPIを使用してパラレルPRNGを作成したいのですが?コードの他のコンパイラへの移植性をどうすれば保証できますか?

言い換えれば、GFortranが言うことを実行する方法(すなわち、実際の並列PRNGを保証する)は、Fortranの固有の命令を使用して移植可能な方法で実行できますか?

注:私はMPIで数値レシピのPRNGを使用していました。それは数年間はうまくいきましたが、数字レシピが言っている整数モデルのいくつかの前提にはいくつかの誤りがあります。これは解決方法がわかりません。内在PRNG可能であれば。

+0

コンパイラ間での移植性/一貫性について気にするならば、 'random_number'(と' random_seed')には多くの問題があります。 – francescalus

+0

* GFortranの言うことを実行する方法はありますか?Fortranの組み込み命令を使用して移植可能な方法で実行していますか?*いいえこれは - http://stackoverflow.com/questions/8920411/possible-sources-for-乱数 - 種 - 有用かもしれません。 –

+0

ご意見ありがとうございます。組み込み関数が移植可能でない場合、Numerical Recipesも(私の経験では)移植性がないようです。他にどのようなライブラリ、サブルーチン、メソッドをお勧めしますか? – alexis

答えて

1

xorshoft1024 *の使用は、非常にというGFortranの新機能であり、開発用トランクバージョンでのみ利用可能であり、これを書いている時点ではまだリリースされていません。これはGCC 7の一部としておそらく2017年春にリリースされます。

したがって、MPIを使用している場合、 PRNGはさまざまなプロセスに入っています(あなたがMPIでそれを自分で処理しない限り)。同じプロセス内の複数のスレッドからPRNGを使用する場合にのみ、PRNGストリームを2^512ステップ転送することができます。

xorshift1024 *はかなり長い期間(2^1024-1)を持ち、PRNGがプロセス(最初はMPIランクと考える)で初めて使用されたとき、OSからのランダムデータで初期化されますRANDOM_SEEDで明示的に初期化されていない限り、POSIXシステムでは/ dev/urandomを使用します。だから、実際にはあなたはうまくいくと思います。異なるMPIランクのPRNGストリームがエイリアスになることは非常にありません。

そして、上記はGFortranバージョン7のPRNGについて説明しています。あなたが何かポータブルなものを望むなら、標準の保証を超えるものに頼ることはできません。並行性の面以外では、移植性の高い高品質の乱数のために、コンパイラが提供するものに頼るのではなく、既知の優れたPRNGを使用する方が良いでしょう(私は、 RANDOM_NUMBERは本質的なものですが、何年も前からベンダーに名前を付けることを控え、今後もビジネスに携わっていると分かりません)。

(あなたは*実装が困難な新しいxorshift1024の意味を見つけた場合は、非難)私、私はそれを考案し、それがb)は、それは不可能Fortranの規格では、簡単なセマンティクスと並行PRNGを持つように実装されているため)

+0

ありがとう@janneb。あなたはfortranで知られている良いと移植性のあるPRNGを提案できますか? – alexis

+0

さて、私はxorshift1024 *かなり良い選択だと思います。リファレンス実装はCで書かれており、Fortranでエミュレートするのは難しい符号なし64ビット算術を使用しています。私はISO_C_BINDINGを介してCの実装を使用することをお勧めします。 – janneb

1

Fortranプログラム用のマルチストリーム乱数ジェネレータのポータブルバージョンを使用する場合、マルチストリームのFortranバージョンのMersenne Twisterがあります。 http://theo.phys.sci.hiroshima-u.ac.jp/~ishikawa/PRNG/mt_stream_en.htmlを参照してください。これは、異なるスレッドに対して非常に多くのステップでPRNGを進めるという概念を使用します。これは、サブルーチンコールによって設定され、設定されるため、さまざまなマルチスレッド環境から使用する必要があります。

関連する問題