yumetodoの旅とプログラミングとかの記録

旅や登山の記録やプログラミング関連の話とかフリーソフト紹介とか

無意味だとしても私はPGOビルドをする

PGOビルドとは

まあざっというとif文の条件分岐予測とか関数のinline展開を適切にするとか関数の配置を最適化するとかして気持ち実行速度を上げる方法です。で、大雑把な手順は

  1. ふつーにビルド(若干コンパイルオプションをいじる)
  2. 空のプロファイルを作る
  3. テスト実行。あんまりたくさんはやらない
  4. プロファイルを元にリビルド

なかんじ。で、Visual Studioでのやり方を調べたんだけど、MSDNの解説がさっぱりわからない。
ガイド付き最適化のプロファイル | MSDN
https://msdn.microsoft.com/ja-jp/library/e7k32f4k.aspx
チュートリアル : Profile-Guided Optimizations の使用 | MSDN
https://msdn.microsoft.com/ja-jp/library/xct6db7f%28v=vs.90%29.aspx
そこで調べていたら昔わけわかめで投げ出したrigayaさんの解説に行き着いた。

rigayaの日記兼メモ帳 x265 ビルド ~ Visual Studio PGOビルド
http://rigaya34589.blog135.fc2.com/blog-entry-540.html

抜粋しつつMSDNみつつで結論がわかったので実際の手順を書いてみる。

手順 on Visual Studio 2015 RC Community

  1. Visual Studio上でフツーにReleaseビルドする。/GLコマンドオプションが必要だけど、Win32コンソールアプリケーションを選んでプロジェクト作ってればデフォでついてるっぽい。
  2. 「ツール」->「Visual Studio コマンドプロンプト
  3. cd [.slnファイルがあるフォルダーのフルパス]
    MSBuild /p:Configuration=Release;WholeProgramOptimization=PGInstrument [ソリューション名.sln]
  4. テスト実行する。
  5. MSBuild /p:Configuration=Release;WholeProgramOptimization=PGOptimize [ソリューション名.sln]

以上!簡単でいいね。

効果の程は?

もともとコンパイラーが優秀だからそこまで速くなるわけではない。
std::threadを使いつつ調和数を求める | CodeGarage
http://codegarage.edisonthk.com/_p/snippet/245
で試したら普通のReleaseビルドが76秒に対しPGOビルドは70.964秒。うん微妙。
まあでもほとんど手間がかからず少しでも高速化できるなら文句はないよね。やって損はない。なんてrigayaさんとおなじありきたりな結論が出たところでこの記事を終えようと思います。