Vitrine TAKT : rav1e 0.8.0, encodage AV1 de clips de test Xiph
Deux builds de l’encodeur AV1 rav1e, version 0.8.0 : la version officielle et le même encodeur après optimisation par TAKT. Sur cinq clips de test publics de Xiph.org, les deux produisent les mêmes fichiers AV1, octet pour octet, et le build TAKT est 1,38× plus rapide en vitesse 10 et 1,30× plus rapide en vitesse 6 (cycles CPU, un thread). Vous trouverez ici les deux programmes, un script qui télécharge les clips depuis Xiph.org, un script qui lance la comparaison, et nos mesures.
Ce que fait le benchmark
Chaque clip est encodé avec une seule ligne de commande, identique pour les deux programmes :
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
La vitesse 10 est le préréglage le plus rapide de rav1e, la vitesse 6 son préréglage par défaut. Les clips sont les 64 premières images de fichiers Y4M originaux 8 bits 4:2:0 de la collection Xiph.org Video Test Media, sans modification (ni redimensionnement, ni réencodage) :
| Clip | Taille d’image, fréquence | Contenu | Fichier source Xiph.org |
|---|---|---|---|
| Elephants Dream | 1280×720, 24 i/s | animation 3D | elephants_dream_720p24.y4m.xz |
| Park Joy | 1280×720, 50 i/s | personnes et feuillage dans un parc | park_joy_420_720p50.y4m |
| Johnny | 1280×720, 60 i/s | personne qui parle face caméra | Johnny_1280x720_60.y4m |
| Bus | 352×288 (CIF), 30 i/s | bus et circulation | bus_cif.y4m |
| Stefan | 352×240 (SIF), 29,97 i/s | joueur de tennis | stefan_sif.y4m |
Mesure (banc TAKT)
AMD Threadripper PRO 5975WX (Zen 3), Linux. Un cœur dédié, le reste de son complexe de cœurs
maintenu inactif ; cycles et instructions en mode utilisateur relevés par perf stat, plus le temps
écoulé. Sept tours entrelacés : à chaque tour, chaque clip est encodé par les deux programmes l’un
après l’autre, la version officielle en premier aux tours impairs et TAKT en premier aux tours
pairs ; nous prenons la médiane par clip et par programme. L’accélération pour un préréglage est la
somme des cinq médianes de la version officielle divisée par la somme des cinq médianes TAKT. Ce
sont exactement les fichiers de bin/ qui ont été mesurés, avec tools/run_bench.sh.
| Préréglage | Officielle, Gcycles | TAKT, Gcycles | Accélération, cycles | Officielle, s | TAKT, s | Accélération, temps |
|---|---|---|---|---|---|---|
| vitesse 10 | 139,8 | 101,6 | 1,38× | 32,3 | 23,7 | 1,37× |
| vitesse 6 | 446,2 | 343,2 | 1,30× | 101,9 | 78,2 | 1,30× |
Par clip (accélération en cycles ; en temps écoulé entre parenthèses) :
| Clip | vitesse 10 | vitesse 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×) |
La plus petite accélération par clip est de 1,28× en cycles (Elephants Dream, vitesse 6). Tous les
échantillons, les médianes et les nombres d’instructions figurent dans measurements.json.
Équivalence
Sur ce benchmark, le build TAKT produit exactement le même flux binaire que rav1e d’origine : à
chaque tour, les dix encodages (5 clips × 2 préréglages) ont été comparés octet par octet, soit
70 paires au total, 70 identiques. Le SHA-256 de chaque fichier de sortie figure dans
tools/expected_ivf.sha256 ; tools/run_bench.sh vérifie vos sorties par rapport à ce fichier.
Cette vitrine couvre la configuration ci-dessus (entrée 8 bits 4:2:0, un thread, vitesses 10 et 6,
quantificateur 100) ; les autres options de rav1e ne faisaient pas partie de cette mesure.
Exécution
python3 tools/fetch_clips.py # télécharge environ 300 Mo, écrit clips/ (283 Mo), vérifie les SHA-256
tools/run_bench.sh # 5 tours, les deux préréglages, les deux programmes ; environ 20 min sur notre banc
CPU=3 tools/run_bench.sh 3 # épingle chaque encodage sur le cœur 3 ; 3 tours
SPEEDS=10 tools/run_bench.sh 1 # aperçu rapide : un tour en vitesse 10 (environ 1 min)
run_bench.sh affiche chaque encodage, un tableau des médianes et des accélérations, et le nombre de
paires de sorties identiques ; il se termine avec le code 1 si une paire diffère. Les cycles sont
indiqués lorsque perf peut compter cycles:u (sinon, seul le temps écoulé est indiqué). Les
données brutes sont écrites dans runs.csv, dans le répertoire de travail qu’il affiche. Chaque
programme peut aussi être lancé directement, comme une ligne de commande rav1e ordinaire :
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 # identiques
Configuration requise : Linux x86-64 avec glibc 2.34 ou plus récente, et un CPU x86-64-v3 (AVX2,
FMA, BMI2 : Intel Haswell et plus récents, AMD Zen et plus récents). Python 3.8+ pour
fetch_clips.py (bibliothèque standard uniquement) ; perf est facultatif.
Comment les programmes ont été compilés
Tous deux de la même manière : rustc 1.96.0, cargo build --release --locked --bin rav1e avec le
profil release propre à rav1e (thin LTO) et ses fonctionnalités par défaut (y compris son assembleur
NASM), -C target-cpu=x86-64-v3
-C debuginfo=0, symboles supprimés. bin/rav1e-0.8.0 est compilé à partir du code source non
modifié de rav1e au tag git v0.8.0 (commit 1fd67cd) ;
vous pouvez le compiler vous-même et comparer. bin/rav1e-0.8.0-takt est compilé à partir du même
code source après optimisation par TAKT. Le code source optimisé n’est pas publié : nous livrons des
builds.
Contenu
bin/rav1e-0.8.0: rav1e 0.8.0 d’origine ;bin/rav1e-0.8.0-takt: rav1e 0.8.0 après optimisation par TAKT ;tools/fetch_clips.py: télécharge les cinq clips depuis Xiph.org et vérifie leurs SHA-256 ;tools/run_bench.sh: lance les deux programmes, compare les sorties, affiche les temps ;tools/expected_ivf.sha256: SHA-256 des dix fichiers de sortie ;measurements.json,SHA256SUMS,LICENSE,THIRD_PARTY_LICENSES.txt.
Licences et droits sur les clips
rav1e est distribué sous la licence BSD 2-Clause et l’Alliance for Open Media Patent License 1.0 ;
les deux programmes sont distribués selon les mêmes conditions (LICENSE), et le code tiers qui y
est lié est répertorié dans THIRD_PARTY_LICENSES.txt. Nos scripts sont sous licence MIT.
Les clips ne font pas partie de cette archive : tools/fetch_clips.py les télécharge depuis
Xiph.org, et ils restent soumis aux conditions qui y sont indiquées. Elephants Dream est
© Blender Foundation / Netherlands Media Art Institute, sous licence Creative Commons Attribution 2.5
(orange.blender.org). Park Joy provient du jeu de test SVT MultiFormat
(Sveriges Television ; conditions dans le
document SVT).
Johnny est indiqué comme relevant du domaine public dans le catalogue Xiph.org. Bus et Stefan sont
des séquences de test standard de la collection Xiph.org, qui en indique les sources d’origine.