← к витрине

Витрина TAKT: rav1e 0.8.0, кодирование тестовых роликов Xiph в AV1

Две сборки AV1-кодера rav1e версии 0.8.0: штатный релиз и тот же кодер после оптимизации TAKT. На пяти общедоступных тестовых роликах Xiph.org обе пишут одинаковые, байт в байт, файлы AV1, а сборка TAKT быстрее в 1,38 раза на speed 10 и в 1,30 раза на speed 6 (такты CPU, один поток). Здесь — обе программы, скрипт, который скачивает ролики с Xiph.org, скрипт, запускающий сравнение, и наши замеры.

Что делает бенчмарк

Каждый ролик кодируется одной командной строкой, одинаковой для обеих программ:

rav1e <clip>_first64.y4m --threads 1 --speed 10 --quantizer 100 --limit 64 --output <clip>.ivf
rav1e <clip>_first64.y4m --threads 1 --speed 6  --quantizer 100 --limit 64 --output <clip>.ivf

Speed 10 — самый быстрый пресет rav1e, speed 6 — пресет по умолчанию. Ролики — первые 64 кадра исходных 8-битных файлов Y4M 4:2:0 из коллекции Xiph.org Video Test Media, без изменений (без масштабирования и перекодирования):

Ролик Размер кадра, частота Содержание Исходный файл на Xiph.org
Elephants Dream 1280×720, 24 кадр/с 3D-анимация elephants_dream_720p24.y4m.xz
Park Joy 1280×720, 50 кадр/с люди и листва в парке park_joy_420_720p50.y4m
Johnny 1280×720, 60 кадр/с говорящая голова Johnny_1280x720_60.y4m
Bus 352×288 (CIF), 30 кадр/с автобус и уличное движение bus_cif.y4m
Stefan 352×240 (SIF), 29,97 кадр/с теннисист stefan_sif.y4m

Замер (стенд TAKT)

AMD Threadripper PRO 5975WX (Zen 3), Linux. Одно выделенное ядро, остальные ядра его комплекса (CCX) простаивают; такты и инструкции пользовательского режима из perf stat, а также реальное время. 7 чередующихся раундов: в каждом раунде каждый ролик кодируется обеими программами подряд, в нечётных раундах первой идёт штатная сборка, в чётных — сборка TAKT; берём медиану по каждому ролику и программе. Ускорение для пресета — сумма пяти медиан штатной сборки, делённая на сумму пяти медиан сборки TAKT. Замерены ровно файлы из bin/, скриптом tools/run_bench.sh.

Пресет Штатная, млрд тактов TAKT, млрд тактов Ускорение по тактам Штатная, с TAKT, с Ускорение по времени
speed 10 139,8 101,6 1,38× 32,3 23,7 1,37×
speed 6 446,2 343,2 1,30× 101,9 78,2 1,30×

По роликам (ускорение по тактам; в скобках — по реальному времени):

Ролик speed 10 speed 6
Elephants Dream 1,31× (1,31×) 1,28× (1,27×)
Park Joy 1,38× (1,38×) 1,29× (1,30×)
Johnny 1,40× (1,38×) 1,37× (1,36×)
Bus 1,40× (1,38×) 1,29× (1,29×)
Stefan 1,45× (1,40×) 1,33× (1,33×)

Наименьшее ускорение на отдельном ролике — 1,28× по тактам (Elephants Dream, speed 6). Все отсчёты, медианы и числа инструкций — в measurements.json.

Эквивалентность

На этом бенчмарке сборка TAKT пишет в точности тот же битовый поток, что и штатный rav1e: в каждом раунде все десять результатов кодирования (5 роликов × 2 пресета) сравнивались побайтно, всего 70 пар, все 70 совпали. SHA-256 каждого выходного файла — в tools/expected_ivf.sha256; tools/run_bench.sh сверяет с ним ваши выходные файлы. Витрина покрывает конфигурацию, описанную выше (вход 8 бит 4:2:0, один поток, speed 10 и 6, quantizer 100); другие параметры rav1e в этот замер не входили.

Запуск

python3 tools/fetch_clips.py              # скачивает около 300 МБ, пишет clips/ (283 МБ), проверяет SHA-256
tools/run_bench.sh                        # 5 раундов, оба пресета, обе программы; около 20 мин на нашем стенде
CPU=3 tools/run_bench.sh 3                # каждое кодирование привязано к ядру 3; 3 раунда
SPEEDS=10 tools/run_bench.sh 1            # быстрая проверка: один раунд на speed 10 (около 1 мин)

run_bench.sh печатает каждое кодирование, таблицу медиан и ускорений и число совпавших пар выходных файлов; если хотя бы одна пара различается, скрипт завершается с кодом 1. Такты выводятся, если perf может считать cycles:u (иначе — только реальное время). Сырые данные пишутся в runs.csv в рабочем каталоге, путь к которому скрипт печатает. Любую из программ можно запустить и напрямую, как обычную командную строку rav1e:

bin/rav1e-0.8.0-takt clips/bus_cif_first64.y4m --threads 1 --speed 6 --quantizer 100 --limit 64 --output bus.ivf
bin/rav1e-0.8.0      clips/bus_cif_first64.y4m --threads 1 --speed 6 --quantizer 100 --limit 64 --output bus-stock.ivf
cmp bus.ivf bus-stock.ivf                 # совпадают

Требования: Linux x86-64 с glibc 2.34 или новее и процессор с x86-64-v3 (AVX2, FMA, BMI2: Intel Haswell и новее, AMD Zen и новее). Python 3.8+ для fetch_clips.py (только стандартная библиотека); perf не обязателен.

Как собраны программы

Обе одинаково: rustc 1.96.0, cargo build --release --locked --bin rav1e с собственным release-профилем rav1e (thin LTO) и features по умолчанию (включая его ассемблерный код на NASM), -C target-cpu=x86-64-v3 -C debuginfo=0, символы удалены. bin/rav1e-0.8.0 собран из неизменённого исходного кода rav1e с git-тега v0.8.0 (коммит 1fd67cd); его можно собрать самостоятельно и сравнить. bin/rav1e-0.8.0-takt собран из того же исходного кода после оптимизации TAKT. Оптимизированный исходный код не публикуется: мы поставляем сборки.

Состав

Лицензии и права на ролики

rav1e распространяется на условиях BSD 2-Clause License и Alliance for Open Media Patent License 1.0; обе программы распространяются на тех же условиях (LICENSE), а сторонний код, скомпонованный с ними, перечислен в THIRD_PARTY_LICENSES.txt. Наши скрипты распространяются по лицензии MIT.

Ролики не входят в этот пакет: tools/fetch_clips.py скачивает их с Xiph.org, и на них по-прежнему распространяются указанные там условия. Elephants Dream — © Blender Foundation / Netherlands Media Art Institute, лицензия Creative Commons Attribution 2.5 (orange.blender.org). Park Joy взят из тестового набора SVT MultiFormat (Sveriges Television; условия — в документе SVT). Johnny отмечен в каталоге Xiph.org как общественное достояние (public domain). Bus и Stefan — стандартные тестовые последовательности коллекции Xiph.org; их первоисточники указаны там же.

Исходный текст: README.ru.md

Telegram