toge's diary

コンピュータ関連の趣味をつらつらと。

dSFMT

ちょっと試してみた。
1つのランダム値を求める方法だとそんなにはやくない。せいぜい20%程度の高速化。
乱数を一度に配列にとる関数だと100%程度の高速化。

一度に大量の乱数が必要になる場合に使うのならば、使う価値があるかも。

#include "dSFMT.h"
#include <boost/random.hpp>

unsigned long long int start_;
unsigned long long int end_;

int main()
{
  dsfmt_t dsfmt;
  dsfmt_init_gen_rand(&dsfmt, 0);
  dsfmt_gv_init_gen_rand(0);

  asm __volatile__ ("rdtsc" : "=A" (start_));

  {
    double value[10000];
    dsfmt_gv_fill_array_open_open(value, 10000);
  }

  asm __volatile__ ("rdtsc" : "=A" (end_));
  printf("%lld\n", end_ - start_);


  asm __volatile__ ("rdtsc" : "=A" (start_));

  for (int index = 0; index < 10000; ++index)
  {
    volatile double value = dsfmt_genrand_open_open(&dsfmt);
  }

  asm __volatile__ ("rdtsc" : "=A" (end_));
  printf("%lld\n", end_ - start_);


  boost::mt19937 gen(0);
  boost::uniform_real<> dist(0, 1);
  boost::variate_generator< boost::mt19937, boost::uniform_real<> > rand(gen, dist);

  asm __volatile__ ("rdtsc" : "=A" (start_));


  for (int index = 0; index < 10000; ++index)
  {
    volatile double value =  rand();
  }

  asm __volatile__ ("rdtsc" : "=A" (end_));
  printf("%lld\n", end_ - start_);
}