icc の最適化を部分的にoff

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)