# Витрина 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, скрипт, запускающий сравнение, и наши замеры. ## Что делает бенчмарк Каждый ролик кодируется одной командной строкой, одинаковой для обеих программ: ```sh rav1e _first64.y4m --threads 1 --speed 10 --quantizer 100 --limit 64 --output .ivf rav1e _first64.y4m --threads 1 --speed 6 --quantizer 100 --limit 64 --output .ivf ``` Speed 10 — самый быстрый пресет rav1e, speed 6 — пресет по умолчанию. Ролики — первые 64 кадра исходных 8-битных файлов Y4M 4:2:0 из коллекции [Xiph.org Video Test Media](https://media.xiph.org/video/derf/), без изменений (без масштабирования и перекодирования): | Ролик | Размер кадра, частота | Содержание | Исходный файл на 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 в этот замер не входили. ## Запуск ```sh 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: ```sh 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](https://github.com/xiph/rav1e/tree/v0.8.0) (коммит 1fd67cd); его можно собрать самостоятельно и сравнить. `bin/rav1e-0.8.0-takt` собран из того же исходного кода после оптимизации TAKT. Оптимизированный исходный код не публикуется: мы поставляем сборки. ## Состав - `bin/rav1e-0.8.0`: штатный rav1e 0.8.0; - `bin/rav1e-0.8.0-takt`: rav1e 0.8.0 после оптимизации TAKT; - `tools/fetch_clips.py`: скачивает пять роликов с Xiph.org и проверяет их SHA-256; - `tools/run_bench.sh`: запускает обе программы, сравнивает выходные файлы, печатает время; - `tools/expected_ivf.sha256`: SHA-256 десяти выходных файлов; - `measurements.json`, `SHA256SUMS`, `LICENSE`, `THIRD_PARTY_LICENSES.txt`. ## Лицензии и права на ролики 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](https://orange.blender.org/)). Park Joy взят из тестового набора SVT MultiFormat (Sveriges Television; условия — в [документе SVT](https://media.xiph.org/video/derf/vqeg.its.bldrdoc.gov/HDTV/SVT_MultiFormat/SVT_MultiFormat_v10.pdf)). Johnny отмечен в каталоге Xiph.org как общественное достояние (public domain). Bus и Stefan — стандартные тестовые последовательности коллекции Xiph.org; их первоисточники указаны там же.