Следите за новостями по этой теме!
Подписаться на «Рифы и пачки / Твоя культура»
Проект FFmpeg, лежащий в основе множества известных видеоредакторов и медиаплееров, снова оказался в центре технических обсуждений. Разработчики утверждают, что реализовали «самый крупный прирост скорости за всю историю» проекта — якобы в 100 раз быстрее после очередного обновления.
Но, как часто бывает, радость преждевременна: такое ускорение стало возможным только на одной весьма специфической функции. А способ достижения результата вызывает легкое недоумение у айтишников — код написан вручную на языке ассемблера, что сегодня считается чуть ли не занятно-экзотическим ремеслом эпохи 90-х.
Ассемблер когда-то был обязательным для прокачки маломощного железа. Теперь это нишевое хобби, сродни реставрации механических часов. Однако программисты FFmpeg называют себя «ассемблер-евангелистами»: гордо продолжают шлифовать отдельные функции теми самыми низкоуровневыми приёмами.
В последнем патче они переписали фильтр rangedetect8_avx512, задействовав инструкции AVX512. Это такая современная серия команд, которая ускоряет обработку данных за счёт параллельной работы процессора. Если ваш процессор не поддерживает AVX512, патч всё равно даёт ускорение — примерно на 65,6% благодаря AVX2.
Разработчики особо подчёркивают: «Мы ускорили всего одну функцию, а не весь FFmpeg». То есть чудесного роста скорости для всех и сразу не ждите. Напомним, нечто похожее команда сообщала в ноябре 2024 года: тогда патч ускорил отдельные операции в среднем до 94 раз, но ещё и из-за того, что сравнивали разные по сложности фильтры — в обычном C-коде использовалась 8-мерная свёртка, а в оптимизированной версии SIMD — более простая 6-мерная.
Оказалось, что если компилировать обычную версию с помощью лучшего компилятора наподобие Clang, разрыв в скорости сокращается более чем наполовину. Это дало повод заподозрить: сравнение проводили между самым худшим и самым лучшим вариантом, и реальные преимущества могли быть преувеличены.
Авторы патча не стесняются иронизировать: «Распределитель регистров в компиляторах — та ещё боль». Мол, ещё бы код компилировался нормально...
Несмотря на скепсис, интерес к низкоуровневой оптимизации не угасает. Ведь FFmpeg используют и популярные плееры наподобие VLC, и множества утилит для скачивания видео с YouTube. Даже ускорение маленького фрагмента кода может отразиться на миллионах пользователей.
Важная оговорка: такие чудеса почти невозможно масштабировать на весь огромный код проекта. Обычно подобные оптимизации нужны для исключительно требовательных задач — и для обычных юзеров разницы заметно не будет. Если только команда FFmpeg не вознамерится вручную переписать всё ядро — тогда ещё посмотрим.
Есть у нас новый кандидат на премию «Реаниматоры ассемблера года». Разработчики FFmpeg собрались вновь доказать миру, что ручной труд ещё в моде — и не где-нибудь, а в высокоточных видеокодеках. Этот коллектив «ассемблер-евангелистов» принялся вручную шлифовать конкретную функцию, обуздав современные AVX512-инструкции, чтобы та рванула вперёд якобы в 100 раз быстрее.
Проблема? Оптимизация касается микроскопического участка программы. Самое весёлое: для большинства обычных пользователей прирост примерно такой же, как смысл в новых альбомах группы ABBA в 2024 году. Некоторых радует и 65,6% улучшение на устройствах без AVX512 — кого не утешит бесплатный бонус скорости в узком месте?
Когда FFmpeg в ноябре прошлый раз объявил об ускорении, позже выяснили: сравнивали несравнимое. Как если бы оценивали мощную «Ладу» против ржавого велосипеда, а потом удивлялись отрыву. Современный же компилятор сильную разницу нивелирует, но кого это волнует, когда нужно хайпануть?
Но мы справедливы: даже крошечная оптимизация важна миллионам пользователей. Только вот сидеть годами на ассемблере — сомнительное удовольствие в эпоху ИИ. Разве что для коллекционеров багов и поклонников ретро.