はてなブログに移行します。

突然ですが、心機一転、はてなブログに移行します。
アカウントも別のものになります。まあ中の人は同じですが。

Xion's Programming Notes

これまでの記事は、とりあえずこのまま残します。
新ブログに記事をインポートするかは未定です。

これまでありがとうございました。
そして、これからもよろしくお願い致します。

続・擬似乱数の計算時間

前回の結果

前回の実験結果はこんな感じ。縦軸は1秒あたりの乱数生成回数です。
条件等は、前回の記事を参照してください。


考察っぽいこと

以下のことは、私の妄想かもしれません。嘘を言っている可能性も多分にあります。
ご注意ください。 # 詳しい人いたら教えてください(^q^)

最も速いsfmtは、1秒間に10億回近くも乱数を生成できます。
使用したCPUが3.5GHzなので、1秒で35億クロック分計算ができるということになります。
したがって、sfmtは3.5〜4clock程で計算できるということになります。
xorやmseqでも、5〜6clock、boostのメルセンヌ・ツイスタでも、8clock以下程度です。

今回は、forループを使って連続で乱数生成をしているので、キャッシュ効率とか最善の状況だと思いますので、実際にはもうちょっと遅くなるのでしょうが、これはなかなか驚異的な数値だと思います。

まとめ

  • SSEが使えるなら、sfmtを使う
  • 数クロックの差が大きい場合、xorshiftやM系列乱数を使う
  • その他の場合は、周期のことを考えて、メルセンヌ・ツイスターを使っておけば、間違いない

疑似乱数の計算時間

お久しぶりです.
実に1年と2ヶ月2週間ぶりの更新です.

リアルが忙しいという事もあったと言えばあったのですが,趣味のプログラミングに労力を割く気力がなかったといいますか,つまり五月病みたいなものですね….

まあそんなネガティブな話はもう忘れてしまって,これからはちょいちょい更新していきたいと思います.

疑似乱数

さて,今回は疑似乱数のお話です.
代表的な疑似乱数生成方法としては,以下のようなものがあります.

標準のCでは,線形合同法のrand()が用意されています.
でもこれはあんまり賢くない方法なので,大事なシミュレーションとかでは使わない方がいいみたいです.
とりあえずメルセンヌ・ツイスタを使っておけば間違いないようです.

疑似乱数生成器の速度比較

今回は,疑似乱数生成器の計算速度の比較をします.

実行環境は,こんな感じ.

CPU Intel Core i7 2700K@3.5GHz
OS Ubuntu 12.04 32bit
gcc 4.6.3

コンパイラオプションは,最適化とSSE2を使用する形で.
と言っても,SSE2を使うのは後述のsfmtだけです.

-O3 -msse2 -DHAVE_SSE2=1 -DSFMT_MEXP=19937

疑似乱数一覧

省略名 詳細 周期
std C標準のrand関数 2^31-1
mt Mersenne Twister 2^19937-1
sfmt SIMD-oriented Fast Mersenne Twister 2^19937-1
boost boostのMersenne Twister 2^19937-1
xor Xorshift 2^128-1
mseq M系列乱数 2^521-1

結果

1億回乱数発生させたforループ全体の時間を計測しました.
結果は以下の通り.

乱数 1回分の時間 1秒あたり回数 stdとの比較
std 1.08e-09 9.26e+07 1.000
mt 4.44e-09 2.25e+08 0.411
sfmt 1.08e-09 9.29e+08 0.100
boost 2.16e-09 4.63e+08 0.200
xor 1.55e-09 6.47e+08 0.143
mseq 1.60e-09 6.26e+08 0.148

速度の早い順に並べると,次のようになります.

sfmt > xor > mseq > boost > mt > std

SSEとか使える環境ならやっぱりSFMTが速いようです.
環境に依存しない方法なら,XorshiftやM系列乱数がMersenne Twisterよりも速いということになります.

SSEすごいな.

あと,なんでboostよりmtが遅いんでしょう.
生成された乱数列を見る限り,boostとmtは全く同じものを生成しているはずなのですが.
boostさんがちょっと工夫してるんでしょうか….

(3月26日追記)
補足ですが,1億回のループを10回やって平均をとっています.
分散も,計測値:偏差=1:10^-3くらいなので,,boostとmtの間には明確な差があるっぽいです.

新年の抱負

新年あけましておめでとうございます。
と言っても、もう成人式も終わってしまいましたがw

新年最初の記事と言うことで、今年の目標を決めようと思います。
今年は、囲碁のプログラムを作ってみたいと思います。

まあどうなるかはわかりませんが、とりあえずやってみようの精神で。
こうして記事にしておいて、あきらめるという選択肢を潰しますw

NTEmacs on Windows 7 64bit

PCを新調しました。
初めての64bit OSということで、探り探りやってる感じです。

今回は、Windows 7 64bitで、NTEmacsをビルドしてみました、というだけですw
でもまあ、32bitアプリケーションなのですが。

ビルド方法

ここに書いてあることをそっくりそのままやりました。

簡単に流れだけ。

  • Cygwin、MSYS+MinGW、GnuWin32 Packages(必要なもの)をインストール
  • EmacsのソースとIME-patchをgnupackから持ってくる
  • CygwinのPATHにMSYS/binとMinGW/binを追加
  • configure, mingw32-make bootstrap, mingw32-make install
  • Emacs/binにGnuWin32のDLLをコピー

結果

versionは、23.3です。.emacsなどは設定していませんが、起動時間は一瞬です。
カスタマイズしたらどれだけ遅くなるのか楽しみです^^

PCを新調しよう

今、3年前に自作したPCを使っています。

だいたいのスペック

CPU Intel Core2 Duo@3GHz
GPU GeForce 8800GT
MEM DDR2 3GB

少し前HDDが壊れて、その場しのぎで20GBの領域にXPをインストールしただけなので、いろいろ厳しく、どうせなら一新しようかな、と思いました。

購入予定の構成

CPU Intel Core i7 2700K
GPU GeForce 560GTX Ti
MEM DDR3 4GB x2 = 8GB

どうせなら64bitOSにチャレンジしてみようと、Windows7 Professional 64bitを入れてみます。最悪、32bit XPがあるし^^;

電源は750Wのもの。たぶん余裕があると思いたい。
相性問題とかもあんまり考えてないけど、たぶん大丈夫だよね?大丈夫であってくれ。

OSをSSDに入れてみようかしら、とも考えましたが、64bitとのダブルチャレンジはやめておきましたw