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. 사용하는 일반적인 전처리, 필터링, 노이즈 제거 등.

상상할 수 있듯이 하드웨어에 따라 시간이 걸릴 수 있습니다! 분석하는데 일주일이 걸렸어요!

각 모듈에 대해 위에서 설명한 보고 프로세스를 사용하여 각 모듈에 대한 컴파일러 플래그 및 최적화를 미세 조정하고 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에 대한 다른 답변을 참조하십시오.

답변2

최신 태그 버전으로 다시 시도했습니다.핸드브레이크 v1.4.0GCC-11 및 CLANG-12에서. 성공적으로 빌드하려면 필수 구성에 대한 일부 변경이 필요합니다. 예를 들어 GCC-11 빌드는 학습 후 구성 파일(절대 경로의 gcda 파일)에 대한 경로를 확인할 수 없기 때문에 일부 모듈을 성공적으로 빌드하지 못합니다.

다음은 GCC-11 및 CLANG-12 v1.4.0에 대한 교육 및 FDO 구성이며, 이는 Handbrake v1.3.3에 대한 이전 답변의 절차와 다릅니다.

GCC-11:

GCC-11에 대한 구성 및 빌드 명령:

./configure --harden --optimize=speed --enable-fdk-aac --disable-nvenc --build=build-v1.4.0 && cd ./build-v1.4.0 && time make -j$(( $(nproc) + 1 ));

훈련/분석 단계 HANDBRAKE V1.4.0 --> GCC-11 custom.defs 파일:

GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic
GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic
X265.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
X265.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
X265_8.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
X265_8.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
X265_10.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
X265_10.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
X265_12.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
X265_12.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBHB.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBHB.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDAV1D.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
GTK.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
GTK.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDVDREAD.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDVDREAD.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDVDNAV.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDVDNAV.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBBLURAY.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBBLURAY.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
TEST.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
TEST.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
FDKAAC.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
FDKAAC.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
ZIMG.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
ZIMG.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDAV1D.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-generate -fprofile-update=atomic -flto

FDO STAGE HANDBRAKE V1.4.0 --> GCC-11 custom.defs 파일:

GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training
GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training
X265.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
X265.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
X265_8.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
X265_8.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
X265_10.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
X265_10.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
X265_12.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
X265_12.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBHB.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBHB.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDAV1D.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
GTK.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
GTK.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDVDREAD.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDVDREAD.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDVDNAV.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDVDNAV.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBBLURAY.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBBLURAY.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
TEST.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
TEST.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
FDKAAC.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
FDKAAC.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
ZIMG.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
ZIMG.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDAV1D.GCC.args.O.speed = -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -msse2avx -O3 -pipe -fprofile-use -fprofile-correction -fprofile-partial-training -flto

LLVM-12/CLANG-12/LLD-12:

Clang은 GCC와 약간 다르게 PGO를 처리합니다. GCC 및 관련 기본 도구에 비해 Clang/LLVM/LLD를 사용하여 모듈에 대한 절대 경로를 확인하는 데 문제가 없다는 것은 분명합니다. 그러나 Clang에는 FDO에 필요한 원본 구성 파일을 병합하기 위한 추가 병합 단계가 있습니다.

따라서 3가지 단계가 있습니다:

  1. 교육/도입 단계
  2. 원본 프로필 데이터 병합
  3. FDO 단계

자세한 단계별 명령. 1단계와 3단계의 custom.defs 파일은 아래 세 단계에 나열되어 있습니다. 이 섹션은 custom.defs가 아닌 각 단계에 필요한 명령을 설명하기 위한 것입니다. 따라서 구성 및 빌드 명령을 실행하기 전에 custom.defs가 있는지 확인해야 합니다.

  1. LLVM-12/CLANG-12/LLD-12에 대한 구성 및 빌드 명령:
LDFLAGS="-fuse-ld=lld" ./configure --ar /usr/bin/llvm-ar --ranlib /usr/bin/llvm-ranlib --strip /usr/bin/llvm-strip --cc /usr/bin/clang --optimize=speed --enable-fdk-aac --disable-nvenc --build=build-v1.4.0-CLANG && cd ./build-v1.4.0-CLANG && time LDFLAGS="-fuse-ld=lld" make -j$(( $(nproc) + 1 ));

빌드 후 GCC의 경우 정상적으로 훈련/프로파일링을 진행하거나 v1.3.3의 초기 지침을 시도한 경우 진행합니다.

  1. 학습/분석 후 원시 분석 데이터를 병합합니다. 및 경로를 빌드의 올바른 위치로 바꿉니다.
llvm-profdata merge -output=<Absolute-Path>/handbrake.profdata <Absolute-Path-To-Profile-Files>/default_*.profraw
  1. FDO 빌드, 이는 1단계와 정확히 동일한 명령줄입니다. 차이점은 custom.defs 파일에 있습니다.
LDFLAGS="-fuse-ld=lld" ./configure --ar /usr/bin/llvm-ar --ranlib /usr/bin/llvm-ranlib --strip /usr/bin/llvm-strip --cc /usr/bin/clang --optimize=speed --enable-fdk-aac --disable-nvenc --build=build-v1.4.0-CLANG && cd ./build-v1.4.0-CLANG && time LDFLAGS="-fuse-ld=lld" make -j$(( $(nproc) + 1 ));

훈련/분석 단계 HANDBRAKE V1.4.0 --> LLVM-12/CLANG-12/LLD-12 custom.defs 파일:

교체하는 것을 기억하세요<구성 파일의 절대 경로>올바른 절대 경로를 사용하십시오.

GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic
GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic
X265.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
X265.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
X265_8.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
X265_8.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
X265_10.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
X265_10.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
X265_12.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
X265_12.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBHB.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBHB.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDAV1D.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
GTK.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
GTK.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDVDREAD.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDVDREAD.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDVDNAV.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDVDNAV.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBBLURAY.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBBLURAY.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
TEST.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
TEST.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
FDKAAC.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
FDKAAC.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
ZIMG.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
ZIMG.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDAV1D.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-generate=<Absolute-Path-To-Profile-Files>/default_%m.profraw -fprofile-update=atomic -flto=thin

FDO STAGE HANDBRAKE V1.4.0 --> LLVM-12/CLANG-12/LLD-12 custom.defs 파일:

교체하는 것을 기억하세요<병합 구성 파일의 절대 경로>올바른 절대 경로를 사용하십시오.

GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata
GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata
X265.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
X265.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
X265_8.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
X265_8.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
X265_10.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
X265_10.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
X265_12.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
X265_12.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBHB.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBHB.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDAV1D.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
GTK.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
GTK.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDVDREAD.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDVDREAD.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDVDNAV.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDVDNAV.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBBLURAY.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBBLURAY.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
TEST.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
TEST.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
FDKAAC.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
FDKAAC.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
ZIMG.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
ZIMG.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDAV1D.GCC.args.O.speed = -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin
LIBDAV1D.GCC.args.extra = -mfpmath=sse -mavx -fstack-protector-strong -D_FORTIFY_SOURCE=2 -march=native -O3 -pipe -fprofile-instr-use=<Absolute-Path-To-Merged-Profile>/handbrake.profdata -flto=thin

좋아, 이제 빌드할 수 있어PGO+LTO가 포함된 핸드브레이크 v1.4.0GCC 또는 LLVM/CLANG/LLD에 반대합니다. 둘 중 귀하의 선호도나 벤치마크에 맞는 것을 자유롭게 선택하세요! :-)

관련 정보