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をインストール。環境変数を設定してもらうのを忘れないようにする。

x265_mercurial_path.png

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

x265_cmake_path.png

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

x265_cmake_bin.png


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



結果
LTCGPGO高速化率
medium26.86 fps27.63 fps+2.9%
slow + pmode9.82 fps10.07 fps+2.5%


普通のLTCGビルド (9.87 fps)
x265_1.4+62_x64_8bpp_ltcg.png

PGOビルド (10.07fps)
x265_1.4+62_x64_8bpp_pgo.png

わずかだが、確かに速い。



とまあ、こんな感じで、たしかに効果はあるけど、すごい効果があるわけでもない。でも速いならそれに越したことはなく、やって損はない、という感じ。

これもVisual Studio Community 2013が公開されたからできることなので、ありがたいことだと思う。


スポンサーサイト



トラックバック


この記事にトラックバックする(FC2ブログユーザー)

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

PGOビルドとは まあざっというとif文の条件分岐予測とか関数のinline展開を適切にするとか関数の配置を最適化するとかして気持ち実行速度を上げる方法です。で、大雑把な手順は ふつーにビルド(若干コンパイルオプションをいじる) 空のプロファイルを作る テスト実行。あんまりたくさんはやらない プロファイルを元にリビルド なかんじ。で、Visual ...

コメントの投稿

非公開コメント

No title

コマンドラインでビルドする方法を初めて知りました
1クリックでビルド出来るようになって非常に便利になりました

Re: No title

参考になったようでよかったです。

確かにソースのダウンロードからビルドまで一発でいけるので便利でよね。

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

Re: No title

確認しましたが、どちらでも動いており、問題の原因はわかりません、ごめんなさい。

ログを見ていただいても分かる通り、x265guiExのコマンド発行も--input省略形を使っています。もちろん、動く方を使っていただければよいのですが…

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

Re: No title

パッチの適用は、
hg import <パッチ名>
のはずなので、hg cloneでx265とパッチをcloneした後、ローカルでhg importを使ってパッチを適用すればよいかと思いますが…。

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

No title

TakuanさんのBlogで、x265の8bit出力版と10bit出力版を1バイナリで実現する方法が書かれてますね
http://otsukemono.blogspot.jp/2015/06/x265-multi-bit-depth-build.html

プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clfilters 
- OpenCLベースの複数のGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

rkmppenc
- Rockchip系SoCのhwエンコーダ

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR