mt-liteに加え、次の疑似乱数生成アルゴリズムを比較対象として評価した。
測定に用いたプログラムの詳細は次の通り。
tests/mt19937ar_benchmark.cをmt19937ar.cとともにリンクした。
mt19937ar.cはmt19937arに同梱のものを用いた。
単一乱数生成方式で、関数内にループを持つ。
tests/mt19937ar_inline_benchmark.cを用いた。
mt19937ar.cは測定コード内に展開される: 最適化にもよるが、前述の条件下ではすべての乱数生成コードが測定箇所にインライン展開された。他はmt19937ar (normal)と同様。
tests/sfmt_seque_benchmark.cをSFMT.cとともにリンクした。
SFMT.cはSFMT(SFMT-src-1.3.2)に同梱のものを用いた。周期は219937-1、乱数生成関数はgen_rand32。SIMD命令を使用する。
単一乱数生成方式で、関数内にループを持つ。
SFMTのSIMD命令対応はx86のSSE2命令およびPowerPCのAltiVec命令のみのため、他の環境での評価はない。
tests/sfmt_seque_inline_benchmark.cを用いた。
SFMT.cは測定コード内に展開される: 最適化にもよるが、前述の条件下ではすべての乱数生成コードが測定箇所にインライン展開された。他はSFMT-mt19937-SIMD-seque (normal)と同様。
なお、SFMT-src-1.3.2同梱のtest.cはこの方法で測定を行っている。
tests/sfmt_block_benchmark.cを用いた。
乱数生成関数はfill_array32。SIMD命令を使用する。インライン展開は行わない。
複数乱数生成方式である。
SIMD命令を使用しない。他はSFMT-mt19937-SIMD-seque (normal)などと同様。
周期が2607-1であることを除いてSFMT-mt19937-SIMD-seque (normal)などと同一。使用したソースコードなども同じ。
tests/well512a_benchmark.cおよびtests/well1024a_benchmark.cを用いた。
関数WELLRNG512aおよびWELLRNG1024aは、WELLのソースコードを外部リンケージで与えた。ただし、他の乱数生成関数と条件を同一にするため、生成する乱数を浮動小数点数から整数に変更して用いた。
単一乱数生成方式で、関数内にループを持たない。
tests/xor128_benchmark.cを用いた。
関数xor128はxorshift RNGの論文に記載のコードを外部リンケージで与えた。
単一乱数生成方式で、関数内にループを持たない。
tests/lcg_benchmark.cを用いた。
32ビット幅の変数による線形合同法で乱数を生成する。乱数生成関数は通常の関数である。
単一乱数生成方式で、関数内にループを持たない。
tests/lcg_inline_benchmark.cを用いた。
乱数生成コードは測定箇所に直接記述される。生成関数は持たない。他はLCG (normal)と同様。
tests/mtlite_benchmark.cを用いた。
乱数生成コードの一部は測定コード内にインライン展開される。状態ベクトルの更新のみ関数呼び出しを行う。
乱数生成関数はまたはmtX_get。単一乱数生成方式で、関数内にループを持つ。
mtX_get_nt
tests/mtlite_benchmark.cを用いた。
乱数生成関数はまたはmtX_get_nonloop。通常の関数で、単一乱数生成方式で、関数内にループを持たない。
mtX_get_nonloop_nt
tests/mtlite_block_benchmark.cを用いた。
乱数生成関数はまたはmtX_get_block。通常の関数で、複数乱数生成方式である。
mtX_get_block_nt
周期が2607-1であることを除いてmtlite-mt19937-loopなどと同一。
使用したソースコードなども同じ。