CFLAGSとCXXFLAGSを最新バージョンのHandBrake(この記事を書く時点のv1.3.3)に渡すと、-flto
以下を追加するまで機能します。失敗する完全なビルド。
LTOオプションを-flto
拡張目標としてHandBrakeを構築し、FDO(Feedback Directed Optimization、FDO、PGOとも呼ばれる)を使用するにはどうすればよいですか。
HandBrakeのほとんどのコーデックは、「手作業でコーディングされた」アセンブリを使用して開発されたため、多くの人がコンパイラ最適化の利点はそれほど大きくないと主張しています。
私はこの主張をテストして挑戦したい!
ベストアンサー1
2021年1月8日に編集されました...次はすべてハンドブレーキv1.3.3。 私の新しい答えを見るハンドブレーキv1.4.0
私は私が要求したのと同様のGitHubの質問に答え、その答えがGithubの問題チケットに埋め込まれているよりも、Stackexchangeの同様の質問について一般により良いサービスを提供すると思いました。 https://github.com/HandBrake/HandBrake/issues/1072#issuecomment-865630524
さらに、観察された利点は、労力を費やし、コーディング/トランスコーディング時間を大幅に節約したい人にも役立ちます。彼らは、作業が完了した後、ベンチマークによってこの主張を証明することができます。
ほとんどの手順は、ここで説明されているコメントに基づいて派生し、実験的です。 https://github.com/griff/HandBrake/blob/master/doc/BUILD-Linux
上記のリンクで述べたように、CFLAGS / CXXFLAGSを使用してコンパイルまたはビルドをブートストラップすることはお勧めできません。 gccフラグを設定するには、組み込みの構成メカニズムを使用することをお勧めします。
どのように?
ハンドブレーキは多くの「crontrib」のフロントエンドです。各contribモジュールがどのように構築されるかを確認するには、ビルドする前に、ビルドまたはターゲットディレクトリの各contribの「make」レポートを利用できます。
ビルドディレクトリを取得するには、次のように初期設定を実行する必要があります。
$ ./configure --build=build --optimize=speed
まだしていないなら。
レポートの作成
たとえば、「build」(上記の設定コマンド値)というフォルダにHandBrakeをビルドするとします。
$ cd ./build
$ make report.help
AVAILABLE MAKEFILE VARS REPORTS
----------------------------------------------------------------
report.main global general vars
report.gcc global gcc vars (inherited by module GCC)
report.var usage: make report.var name=VARNAME
x265.report X265-scoped vars
x265_8.report X265_8-scoped vars
x265_10.report X265_10-scoped vars
x265_12.report X265_12-scoped vars
libdav1d.report LIBDAV1D-scoped vars
ffmpeg.report FFMPEG-scoped vars
libdvdread.report LIBDVDREAD-scoped vars
libdvdnav.report LIBDVDNAV-scoped vars
libbluray.report LIBBLURAY-scoped vars
nvenc.report NVENC-scoped vars
libhb.report LIBHB-scoped vars
test.report TEST-scoped vars
gtk.report GTK-scoped vars
pkg.report PKG-scoped vars
上記の最初の列の各行に各レポートが表示されます。その後、次の方法でレポートにアクセスできます。
$ make <report_name>
<report_name>
目的のレポートの場所に置き換えます。
各レポート内にも上記の階層と継承があることは注目に値します。
report.gcc
gcc フラグのルートとして使用できます。
私の場合は、以前は「Speed」を使用してビルドを構成することを選択しました...
$ ./configure --build=build --optimize=speed
これは次のようにマッピングされます。
GCC.args.O.speed
内部にreport.gcc
レポートのもう一つの重要な鍵は
GCC.args.extra
デフォルトでは、電子の後に追加のコンパイラオプションフラグを追加することが「可能」です。 gccがわかるように、オプション間に競合がある場合は、最後のオプションが使用されます。複数のモジュールがどちらかを使用しているのか、それとも両方を使用しているのかはわかりにくいため、最初のモジュールの内容が後者に含まれることを確認する傾向があります。しかし、後者ははるかに多くを含めることができます!レポートを確認すると、デフォルト値を確認できます。
「というテキストファイル構成を作成して上記の内容を上書きできます。カスタムファイル"はハンドブレークソースフォルダのルートにあります(またはgitが複製されている場合はHandBrakeの最上位フォルダにあり、デフォルトでgit pullコマンドを実行できます)。
/HandBrake$ ls -h
AUTHORS.markdown CODE_OF_CONDUCT.md CONTRIBUTING.md download gtk macosx pkg scripts THANKS.markdown
build configure COPYING gccFDO libhb make preset SECURITY.md TRANSLATION.markdown
build2 contrib custom.defs graphics LICENSE NEWS.markdown README.markdown test win
FDO(別名PGO)
私はシステムでFDO(Feedback Directed Optimization、別名FDO、別名PGO - Profile Guided Optimization)を実行するので、通常は最初にビルドして次のように定義しますcustom.defs
。
$ cat custom.defs
GCC.args.O.speed = -march=native -O3 -pipe -fprofile-generate=../gccFDO -fprofile-update=atomic
GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -fprofile-generate=../gccFDO -fprofile-update=atomic
次に、HandBrakeを実行して、さまざまなコーデック、フィルタ、設定を使用して複数のビデオをトランスコードします。構成ファイルの生成には数日かかります。次に、生成された構成ファイルを使用します。
$ cat custom.defs
GCC.args.O.speed = -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
新しいビルドディレクトリにあります。分析の一般的な容疑者は、一般的なターゲットエンコーディングタイプの一般的なソースタイプです。私の一般的なターゲットタイプはAACオーディオのx265_10bitです。
- x264からx265_10bitへ
- x265からx265_10bitへ
- さまざまな形のAC3から、あなたが使用する一般的なAACまで
- 様々な形態のDTSから一般的なAACまで
- 使用する一般的な前処理、フィルタリング、ノイズ除去など。
想像できるように、ハードウェアによっては時間がかかることがあります!分析に1週間かかりました!
各モジュールについて上記のレポート処理を使用して、各モジュールのコンパイラフラグと最適化を微調整し、上記custom_defs
のデフォルト値の例のように、目的の値でファイル内のキーを参照してキーをオーバーライドできます。GCC.args.*
。
上記のすべての機能を機能させるには、CFLAGSまたはCXXFLAGSをエクスポートしないでください。以下を使用して、bashセッションに設定されたフラグを確認できます。
$ export -p | grep FLAGS
LTO + FDO:
FDOと組み合わせたリンク時間最適化LTOは優れており、Googleで多くのプログラムやベンチマークを簡単に検索できます。
GCC.args.*
残念ながら、FFMPEGモジュールを使用するようにLTOを設定するか、-flto
LTOのデフォルト値を設定するとき。失敗する完全なビルド。これはブールORです。どちらか一方または両方が失敗します!
ただし、LTOは他のすべてのモジュールに追加できます!
これは私のものですcustom.defs
...
$ cat custom.defs
GCC.args.O.speed = -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_8.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_8.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_10.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_10.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_12.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
X265_12.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBHB.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBHB.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDAV1D.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDAV1D.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GTK.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
GTK.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDREAD.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDREAD.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDNAV.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBDVDNAV.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBBLURAY.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
LIBBLURAY.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
TEST.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
TEST.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
NVENC.GCC.args.O.speed = -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
NVENC.GCC.args.extra = -mfpmath=sse -march=native -O3 -pipe -flto -fprofile-use=../gccFDO -fprofile-correction -fprofile-partial-training
2021年1月8日に編集されました... 上記の作業はすべてHandbrakeに対して行われました。v1.3.3。
v1.4.0では、上記のプロセスが失敗しました。 v1.4.0 の他の回答を参照してください。