x265 ビルド ~ Visual Studio PGOビルド
コメントで教えていただき、昨日書いたように、Visual Studio Community 2013が公開され、Professional相当の機能が使えるようになった。これによってPGO (Profile Guided Optimization, プロファイリングによる最適化) ビルドができるようになった。
そこで、PGOビルドなx265を作ってみた。PGOビルドはGUIからやると割と面倒なので、あまり好きじゃないけどコマンドベースで。
普通のビルドに比べて2~3%高速。やる価値あるかというと、少なくとも「やって損はない」かな、と。
※2015.06.01 更新 - 最適化オプションを調整。
PGOビルド
通常のコンパイラの最適化は、コンパイル時にコードを解析して最適化をかける。PGO (プロファイリングによる最適化) は、それに加えて、実際にプログラムを実行した時の情報を使ってさらなる最適化を加える。gccだと、-fprofiledかな?
実際の手順は、
1. 情報収集用の実行ファイルをまずコンパイル。
2. 1で作成した実行ファイルで実際にプログラムを走らせ、情報を収集。exeを実行すると同じフォルダにpgcファイルができる(これが収集した情報)。
3. 2で収集した情報をもとにさらに最適化。
行われる最適化は、
・より的確なインライン展開の判断。
・レジスタ割り当ての最適化。
・最適な/Og ←→ /Os 切り替え。
・関数レイアウトの最適化。測定した関数の呼び出し傾向をもとに、呼び出される関数を呼び出し元の近くに配置し、(命令)キャッシュ効率を向上させる。
・使用頻度の低い部分の分離。これもキャッシュ効率の向上につながる。
・プログラム実行中、どちらがtrueになりやすいかという情報に基づいて、条件分岐の最適化。
などなど。
ビルドの準備
Visual Studio Community 2013
CMake (Win32 Installer をダウンロード)
Mercurial (MSI installer かInno Setup installerのどちらかを)
yasm
適当なy4mファイル (ffmpegとかで自分で作るか、このあたりから適当に bus_cif.y4mとかで)
ffmpegでy4mを作る場合、
ffmpeg.exe -y -i <ソース動画> -an -pix_fmt yuv420p -f yuv4mpegpipe -frame 240 <出力.y4m>
とかで作れば良いと思う。
1. インストーラに従ってVisual Studio Community 2013をインストール。ダウンロード・インストール方法はこちら。
2. インストーラに従ってMericurialをインストール。環境変数を設定してもらうのを忘れないようにする。

3. インストーラに従ってCMakeをインストール。環境変数を設定してもらうのを忘れないようにする。

4.ダウンロードしたyasmをパスの通じているところへ配置する。さっきCMakeのbinにパスを通しているので、Cmake\binに放り込んだ。

5. ひとまず、コマンドプロンプトで、
がそれぞれ反応があるか確かめる。
これで準備は完了。
ビルド実行
これで終わり。
効果は?
環境
Win 8.1 x64
Core i7 5960X (8C/16T, L3=20MB)
Core 4.4GHz / Cache 3.8GHz
DDR4-2666, 4ch, 32GB
Aviutl 1.00
lwinput r726
x265guiEx 3.48v2
ソース
グリザイアの果実 (アニメ) OP を一度x264 (crf=18) + x264guiEx + afsでエンコードしたもの。
1920x1080p 23.976fps H.264/AVC 2155frames 8483kbps
x265.exe 1.4+62 x64 8bit
・PGOビルド
・普通のLTCGビルド
実行ファイルはこちら。
x265 オプション
--preset medium --crf 21
--preset slow --crf 21 --pmode
結果
普通のLTCGビルド (9.87 fps)

PGOビルド (10.07fps)

わずかだが、確かに速い。
とまあ、こんな感じで、たしかに効果はあるけど、すごい効果があるわけでもない。でも速いならそれに越したことはなく、やって損はない、という感じ。
これもVisual Studio Community 2013が公開されたからできることなので、ありがたいことだと思う。
そこで、PGOビルドなx265を作ってみた。PGOビルドはGUIからやると割と面倒なので、あまり好きじゃないけどコマンドベースで。
普通のビルドに比べて2~3%高速。やる価値あるかというと、少なくとも「やって損はない」かな、と。
※2015.06.01 更新 - 最適化オプションを調整。
PGOビルド
通常のコンパイラの最適化は、コンパイル時にコードを解析して最適化をかける。PGO (プロファイリングによる最適化) は、それに加えて、実際にプログラムを実行した時の情報を使ってさらなる最適化を加える。gccだと、-fprofiledかな?
実際の手順は、
1. 情報収集用の実行ファイルをまずコンパイル。
2. 1で作成した実行ファイルで実際にプログラムを走らせ、情報を収集。exeを実行すると同じフォルダにpgcファイルができる(これが収集した情報)。
3. 2で収集した情報をもとにさらに最適化。
行われる最適化は、
・より的確なインライン展開の判断。
・レジスタ割り当ての最適化。
・最適な/Og ←→ /Os 切り替え。
・関数レイアウトの最適化。測定した関数の呼び出し傾向をもとに、呼び出される関数を呼び出し元の近くに配置し、(命令)キャッシュ効率を向上させる。
・使用頻度の低い部分の分離。これもキャッシュ効率の向上につながる。
・プログラム実行中、どちらがtrueになりやすいかという情報に基づいて、条件分岐の最適化。
などなど。
ビルドの準備
Visual Studio Community 2013
CMake (Win32 Installer をダウンロード)
Mercurial (MSI installer かInno Setup installerのどちらかを)
yasm
適当なy4mファイル (ffmpegとかで自分で作るか、このあたりから適当に bus_cif.y4mとかで)
ffmpegでy4mを作る場合、
ffmpeg.exe -y -i <ソース動画> -an -pix_fmt yuv420p -f yuv4mpegpipe -frame 240 <出力.y4m>
とかで作れば良いと思う。
1. インストーラに従ってVisual Studio Community 2013をインストール。ダウンロード・インストール方法はこちら。
2. インストーラに従ってMericurialをインストール。環境変数を設定してもらうのを忘れないようにする。

3. インストーラに従ってCMakeをインストール。環境変数を設定してもらうのを忘れないようにする。

4.ダウンロードしたyasmをパスの通じているところへ配置する。さっきCMakeのbinにパスを通しているので、Cmake\binに放り込んだ。

5. ひとまず、コマンドプロンプトで、
がそれぞれ反応があるか確かめる。
これで準備は完了。
ビルド実行
これで終わり。
効果は?
環境
Win 8.1 x64
Core i7 5960X (8C/16T, L3=20MB)
Core 4.4GHz / Cache 3.8GHz
DDR4-2666, 4ch, 32GB
Aviutl 1.00
lwinput r726
x265guiEx 3.48v2
ソース
グリザイアの果実 (アニメ) OP を一度x264 (crf=18) + x264guiEx + afsでエンコードしたもの。
1920x1080p 23.976fps H.264/AVC 2155frames 8483kbps
x265.exe 1.4+62 x64 8bit
・PGOビルド
・普通のLTCGビルド
実行ファイルはこちら。
x265 オプション
--preset medium --crf 21
--preset slow --crf 21 --pmode
結果
LTCG | PGO | 高速化率 | |
---|---|---|---|
medium | 26.86 fps | 27.63 fps | +2.9% |
slow + pmode | 9.82 fps | 10.07 fps | +2.5% |
普通のLTCGビルド (9.87 fps)

PGOビルド (10.07fps)

わずかだが、確かに速い。
とまあ、こんな感じで、たしかに効果はあるけど、すごい効果があるわけでもない。でも速いならそれに越したことはなく、やって損はない、という感じ。
これもVisual Studio Community 2013が公開されたからできることなので、ありがたいことだと思う。
スポンサーサイト