6.2. 評価対象

mt-liteに加え、次の疑似乱数生成アルゴリズムを比較対象として評価した。

測定に用いたプログラムの詳細は次の通り。

mt19937ar (normal)

tests/mt19937ar_benchmark.cmt19937ar.cとともにリンクした。

mt19937ar.cmt19937arに同梱のものを用いた。

単一乱数生成方式で、関数内にループを持つ。

mt19937ar (inlined)

tests/mt19937ar_inline_benchmark.cを用いた。

mt19937ar.cは測定コード内に展開される: 最適化にもよるが、前述の条件下ではすべての乱数生成コードが測定箇所にインライン展開された。他はmt19937ar (normal)と同様。

SFMT-mt19937-SIMD-seque (normal)

tests/sfmt_seque_benchmark.cSFMT.cとともにリンクした。

SFMT.cSFMT(SFMT-src-1.3.2)に同梱のものを用いた。周期は219937-1、乱数生成関数はgen_rand32。SIMD命令を使用する。

単一乱数生成方式で、関数内にループを持つ。

SFMTのSIMD命令対応はx86のSSE2命令およびPowerPCのAltiVec命令のみのため、他の環境での評価はない。

SFMT-mt19937-SIMD-seque (inlined)

tests/sfmt_seque_inline_benchmark.cを用いた。

SFMT.cは測定コード内に展開される: 最適化にもよるが、前述の条件下ではすべての乱数生成コードが測定箇所にインライン展開された。他はSFMT-mt19937-SIMD-seque (normal)と同様。

なお、SFMT-src-1.3.2同梱のtest.cはこの方法で測定を行っている。

SFMT-mt19937-SIMD-block

tests/sfmt_block_benchmark.cを用いた。

乱数生成関数はfill_array32。SIMD命令を使用する。インライン展開は行わない。

複数乱数生成方式である。

SFMT-mt19937-noSIMD-seque (normal), SFMT-mt19937-noSIMD-seque (inlined), SFMT-mt19937-noSIMD-block

SIMD命令を使用しない。他はSFMT-mt19937-SIMD-seque (normal)などと同様。

SFMT-mt607-SIMD-seque (normal), SFMT-mt607-SIMD-seque (inlined), SFMT-mt607-SIMD-block, SFMT-mt607-noSIMD-seque (normal), SFMT-mt607-noSIMD-seque (inlined), SFMT-mt607-noSIMD-block

周期が2607-1であることを除いてSFMT-mt19937-SIMD-seque (normal)などと同一。使用したソースコードなども同じ。

WELL512a, WELL1024a

tests/well512a_benchmark.cおよびtests/well1024a_benchmark.cを用いた。

関数WELLRNG512aおよびWELLRNG1024aは、WELLのソースコードを外部リンケージで与えた。ただし、他の乱数生成関数と条件を同一にするため、生成する乱数を浮動小数点数から整数に変更して用いた。

単一乱数生成方式で、関数内にループを持たない。

xor128

tests/xor128_benchmark.cを用いた。

関数xor128xorshift RNGの論文に記載のコードを外部リンケージで与えた。

単一乱数生成方式で、関数内にループを持たない。

LCG (normal)

tests/lcg_benchmark.cを用いた。

32ビット幅の変数による線形合同法で乱数を生成する。乱数生成関数は通常の関数である。

単一乱数生成方式で、関数内にループを持たない。

LCG (inlined)

tests/lcg_inline_benchmark.cを用いた。

乱数生成コードは測定箇所に直接記述される。生成関数は持たない。他はLCG (normal)と同様。

mtlite-mt19937-loop, mtlite-mt19937-loop-nt

tests/mtlite_benchmark.cを用いた。

乱数生成コードの一部は測定コード内にインライン展開される。状態ベクトルの更新のみ関数呼び出しを行う。

乱数生成関数はmtX_getまたはmtX_get_nt。単一乱数生成方式で、関数内にループを持つ。

mtlite-mt19937-nonloop, mtlite-mt19937-nonloop-nt

tests/mtlite_benchmark.cを用いた。

乱数生成関数はmtX_get_nonloopまたはmtX_get_nonloop_nt。通常の関数で、単一乱数生成方式で、関数内にループを持たない。

mtlite-mt19937-block, mtlite-mt19937-block-nt

tests/mtlite_block_benchmark.cを用いた。

乱数生成関数はmtX_get_blockまたはmtX_get_block_nt。通常の関数で、複数乱数生成方式である。

mtlite-mt607-loop, mtlite-mt607-loop-nt, mtlite-mt607-nonloop, mtlite-mt607-nonloop-nt, mtlite-mt607-block, mtlite-mt607-block-nt

周期が2607-1であることを除いてmtlite-mt19937-loopなどと同一。

使用したソースコードなども同じ。