iccの最適化のバグを見つけてしまった.boost/random.hpp を使った乱数生成処理を"-O2"とか"-O3"を付けてコンパイルすると,乱数の値が常にゼロになってしまう."-O0"ならば正しく乱数が生成できるので,最適化のバグであることは間違いない.
iccのバージョンはちょっと古い.
$ icc --version icc (ICC) 9.0 20050430
きっと最新版ではバグは直っているだろうなぁとか思いつつ(10/11追記.最新版では直っていた.),とりあえずマニュアルを眺めたところ,icc でも #pragma 文で最適化をon/offできることが判明.具体的には以下のようになる.
#pragma optimize("", off) /*最適化をoffにする*/ #pragma optimize("", on) /*最適化をonにする*/
テストで書いたコードは次のようになる.これで -O3 とかでコンパイルしても,最適化はかからない.正常に乱数が生成できることも確認できた.
#include <iostream> #include <boost/random.hpp> using namespace boost; #pragma optimize("", off) int main() { mt19937 gen( static_cast<unsigned long>(time(0)) ); uniform_int<> dst(0,100); variate_generator<mt19937, uniform_int<> > rand(gen, dst); for (int i=0; i<100; i++) cout << rand() << endl; return 0; } #pragma optimize("", on)