Как собрать последнюю версию HandBrake в Linux с помощью FDO (PGO )+ LTO?

Если вы посмотрите на ссылку /proc/$PID/fd/0, вы увидите, что она указывает на терминал:

# ls -l /proc/11962/fd/0
lrwx------ 1 foo users 64 Aug 15 04:30 /proc/11962/fd/0 -> /dev/pts/15

Когда вы выводите на него, вы не передаете ввод процессу nc, вы выводите на терминал. Который должным образом печатает то, что вы выводите.

Это выглядит так:

   /proc/$PID/fd/$N   <-------> [            ]
                                [  terminal  ]
[  nc  ] <--------------------> [            ]

Не так:

           /proc/$PID/fd/$N  
               |       |
[      ] <-----+       +------> [            ]
[  nc  ] <--------------------> [  terminal  ]

Если файловый дескриптор 0 процесса был открыт для файла, вы все равно ожидаете, что запись в /proc/$PID/fd/0будет показана как входные данные для процесса или для перехода к открытому файлу?

lrwx------ 1 foo users 64 Aug 15 04:36 /proc/11994/fd/0 -> /tmp/testfile

Что делать echo foo > /proc/11994/fd/0в этом случае?

Здесь то же самое. Когда процесс читает из fd, он считывает данные из файла. Но когда вы повторно открываете тот же файл для записи через /proc/$PID/fd/$N, вы записываете в файл.

Вам потребуется использовать ioctl TIOCSTI или аналогичный механизм для заполнения данными во входном буфере терминала. См. tty _ioctl (4)

1
23.06.2021, 04:35
1 ответ

РЕДАКТИРОВАТЬ 08.01.2021...Все нижеизложенное было сделано для Handbrake v1.3.3. См. мой новый ответ для Handbrake v1.4.0

Я ответил на вопрос в GitHub, похожий на вопрос, который я задал, и подумал, что ответ будет лучше служить публике с похожими проблемами здесь, на stackexchange, вместо того, чтобы быть зарытым в тикет о проблеме github....https://github.com/HandBrake/HandBrake/issues/1072#issuecomment-865630524

Кроме того, наблюдаемые преимущества послужат тем, кто готов приложить усилия, и сэкономят им много времени на кодирование/транскодирование. Они могут оценить усилие после его выполнения, чтобы доказать утверждение.

Большая часть процедуры была выведена и проверена на основе заметок, описанных здесь...https://github.com/griff/HandBrake/blob/master/doc/BUILD-Linux

Как описано в приведенной выше ссылке, не рекомендуется использовать CFLAGS/CXXFLAGS для управления компиляцией или сборкой. Рекомендуется использовать встроенный -механизм конфигурации для установки флагов gcc.

КАК?

Ручной тормоз — это просто передний -конец МНОГО "кронтрибов". Чтобы увидеть, как создается каждый модуль contrib, вы можете использовать отчеты «создать» для каждого вклада в каталоге сборки или целевом каталоге, прежде чем создавать их.

Чтобы получить каталог сборки, вам нужно выполнить первоначальную настройку через...

$ ./configure --build=build --optimize=speed

если у вас его нет.

СОСТАВЛЯЙТЕ ОТЧЕТЫ

напр. Допустим, вы собираете HandBrake в папке с именем «build» (, как значение в команде configure выше ), затем:

$  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.

В моем случае я решил настроить сборку с использованием «скорости» ранее...

$ ./configure --build=build --optimize=speed

Что соответствует

GCC.args.O.speed

вreport.gcc

Другим важным ключом в этом отчете является

GCC.args.extra

, которые в основном «могут» добавлять дополнительные флаги опций компилятора после первого. Как вы знаете, в gcc, если есть конфликт между опциями, используется последняя. Поскольку мы не можем достаточно легко сказать, используют ли многие модули один, другой или оба, я стараюсь убедиться, что все, что есть в первом, также есть и во втором. Но последний может содержать больше! Вы можете увидеть значения по умолчанию, проверив отчет.

Вы можете переопределить вышеуказанное, создав текстовый файл конфигурации с именем « custom.defs » в корне исходной папки ручного тормоза (, если вы клонировали его с помощью 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 (обратную связь -Directed Optimization aka FDO aka 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

в новом каталоге сборки. Хорошими обычными подозреваемыми для профилирования будут типичные исходные типы для вашего типичного целевого типа кодирования. Мой типичный целевой тип — x265 _10 бит со звуком AAC :

.
  1. От x264 до x265 _10 бит
  2. От x265 до x265 _10 бит
  3. От различных форм AC3 до типичного используемого вами AAC
  4. От различных форм DTS до типичного используемого вами AAC
  5. Любая типичная предварительная -обработка, фильтрация, шумоподавление и т. д., которые вы используете.

Как вы понимаете, в зависимости от вашего оборудования это может занять некоторое время! Мое профилирование заняло неделю!

Вы можете точно настроить флаги компилятора и оптимизацию для каждого модуля, используя процесс создания отчетов, который я описал выше для каждого модуля, и переопределив ключи, заключив их в кавычки в файле custom_defsс нужными вам значениями, как в примере выше. для значений по умолчанию GCC.args.*.

Чтобы все вышеперечисленное работало, не забудьте не экспортировать CFLAGS или CXXFLAGS. Вы можете проверить, какие флаги вы установили в сеансе bash, с помощью:

$  export -p | grep FLAGS

LTO + FDO:

Оптимизация времени соединения LTO и FDO отлично сочетаются друг с другом, поскольку их можно легко найти в Google для многих программ и тестов.

К сожалению, при установке LTO по умолчанию в GCC.args.*с помощью -fltoили установке LTO для модуля FFMPEG; сбой всей сборки. Это логическое «или». Он потерпит неудачу на одном или другом или на обоих!

Однако 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

РЕДАКТИРОВАТЬ 08.01.2021... Все вышеперечисленное было сделано против Handbrake v1.3.3 .

Описанный выше процесс не удался для версии 1.4.0 Пожалуйста, смотрите мой другой ответ для v1.4.0.

1
28.07.2021, 11:22

Теги

Похожие вопросы