Витрина 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.
Оптимизированный исходный код не публикуется: мы поставляем сборки.
Состав
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). Park Joy взят из тестового набора SVT MultiFormat
(Sveriges Television; условия — в
документе SVT).
Johnny отмечен в каталоге Xiph.org как общественное достояние (public domain). Bus и Stefan —
стандартные тестовые последовательности коллекции Xiph.org; их первоисточники указаны там же.