0

現在、George Marsaglia の Ziggurat 乱数ジェネレーターのバージョンを実装しています。これは、高品質の正規分布乱数ジェネレーターを生成する最速の方法の 1 つであると思われますが、ループ制御コード (つまり、ループの途中での return ステートメント、if ステートメント、分岐など) でいっぱいであり、 exp() や log() などの標準 C 関数へのいくつかの呼び出し。無限ループは言うまでもありません。

これにより、コンパイラによってパイプライン化できないコードが作成されます。最終的には、中心極限定理を直接使用するなどの基本的なアプローチは、簡単にパイプライン化できるため、最終的には高速になる可能性があると思います。残念ながら、ガウス分布の裾には適していないため、私のアプリケーションには受け入れられません。

制御コードと関数呼び出しを削減する方法について何かアイデアを持っている人はいますか? 私は現在、C に移植したアルゴリズムの Colin Green の実装を使用しています。私の基礎となる一様生成器は Tiny Mersenne Twister です (他の人が見たように MT を使用するように言わないでください。私は既にこの議論は、均一な RNG ではなく、通常分布の RNG に関するものです)。

4

1 に答える 1

2

ここで私の C 実装を見て ください。メイン関数はわずか 20 行のコードなので、ループを少し展開するのは簡単なはずです。また、整数比較または浮動小数比較のうち、マシン上で高速な方を使用することもできます。任意のバックエンド RNG をプラグインできます。

于 2013-07-24T21:38:56.873 に答える