FDO(PGO)+ LTOを使用してLinuxで最新のHandBrakeを構築するには?

FDO(PGO)+ LTOを使用してLinuxで最新のHandBrakeを構築するには?

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です。

  1. x264からx265_10bitへ
  2. x265からx265_10bitへ
  3. さまざまな形のAC3から、あなたが使用する一般的なAACまで
  4. 様々な形態のDTSから一般的なAACまで
  5. 使用する一般的な前処理、フィルタリング、ノイズ除去など。

想像できるように、ハードウェアによっては時間がかかることがあります!分析に1週間かかりました!

各モジュールについて上記のレポート処理を使用して、各モジュールのコンパイラフラグと最適化を微調整し、上記custom_defsのデフォルト値の例のように、目的の値でファイル内のキーを参照してキーをオーバーライドできます。GCC.args.*

上記のすべての機能を機能させるには、CFLAGSまたはCXXFLAGSをエクスポートしないでください。以下を使用して、bashセッションに設定されたフラグを確認できます。

$  export -p | grep FLAGS

LTO + FDO:

FDOと組み合わせたリンク時間最適化LTOは優れており、Googleで多くのプログラムやベンチマークを簡単に検索できます。

GCC.args.*残念ながら、FFMPEGモジュールを使用するようにLTOを設定するか、-fltoLTOのデフォルト値を設定するとき。失敗する完全なビルド。これはブール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 の他の回答を参照してください。

おすすめ記事