TAKT-Showcase: rav1e 0.8.0, AV1-Kodierung von Xiph-Testclips
Zwei Builds des AV1-Encoders rav1e in Version 0.8.0: das unveränderte Release und derselbe Encoder nach der TAKT-Optimierung. Auf fünf öffentlichen Testclips von Xiph.org schreiben beide dieselben AV1-Dateien, Byte für Byte, und der TAKT-Build ist mit speed 10 1,38-mal und mit speed 6 1,30-mal schneller (CPU-Takte, ein Thread). Das Paket enthält beide Programme, ein Skript, das die Clips von Xiph.org herunterlädt, ein Skript, das den Vergleich ausführt, sowie unsere Messungen.
Was der Benchmark macht
Jeder Clip wird mit einer Kommandozeile kodiert, die für beide Programme identisch ist:
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
Das Preset speed 10 ist das schnellste von rav1e, speed 6 ist die Voreinstellung. Die Clips sind die ersten 64 Frames der originalen 8-Bit-4:2:0-Y4M-Dateien aus der Sammlung Xiph.org Video Test Media, unverändert (keine Skalierung, keine Neukodierung):
| Clip | Bildgröße, Bildrate | Inhalt | Quelldatei bei Xiph.org |
|---|---|---|---|
| Elephants Dream | 1280×720, 24 fps | 3D-Animation | elephants_dream_720p24.y4m.xz |
| Park Joy | 1280×720, 50 fps | Menschen und Laub in einem Park | park_joy_420_720p50.y4m |
| Johnny | 1280×720, 60 fps | Sprecher in Nahaufnahme | Johnny_1280x720_60.y4m |
| Bus | 352×288 (CIF), 30 fps | Bus und Straßenverkehr | bus_cif.y4m |
| Stefan | 352×240 (SIF), 29,97 fps | Tennisspieler | stefan_sif.y4m |
Messung (TAKT-Messstand)
AMD Threadripper PRO 5975WX (Zen 3), Linux. Ein dedizierter Kern, der Rest seines Core-Complex
bleibt im Leerlauf; Takte und Instruktionen im User-Modus aus perf stat, dazu die Wall-Time.
7 abwechselnde Runden: In jeder Runde wird jeder Clip von beiden Programmen direkt nacheinander
kodiert, in ungeraden Runden zuerst vom Original, in geraden zuerst von TAKT; wir nehmen den Median
pro Clip und Programm. Die Beschleunigung für ein Preset ist die Summe der fünf Original-Mediane
geteilt durch die Summe der fünf TAKT-Mediane. Gemessen wurden genau die Dateien in bin/, mit
tools/run_bench.sh.
| Preset | Original, Mrd. Takte | TAKT, Mrd. Takte | Beschleunigung, Takte | Original, s | TAKT, s | Beschleunigung, Zeit |
|---|---|---|---|---|---|---|
| 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× |
Pro Clip (Beschleunigung nach Takten; nach Wall-Time in Klammern):
| Clip | 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×) |
Die kleinste Beschleunigung pro Clip beträgt 1,28× nach Takten (Elephants Dream, speed 6). Alle
Einzelmessungen, Mediane und Instruktionszahlen stehen in measurements.json.
Äquivalenz
Auf diesem Benchmark schreibt der TAKT-Build exakt denselben Bitstream wie das unveränderte rav1e:
In jeder Runde wurden alle zehn Kodierungen (5 Clips × 2 Presets) Byte für Byte verglichen,
insgesamt 70 Paare, 70 identisch. Die SHA-256 jeder Ausgabedatei steht in tools/expected_ivf.sha256;
tools/run_bench.sh prüft Ihre Ausgaben dagegen. Dieses Showcase umfasst die obige Konfiguration
(8-Bit-4:2:0-Eingabe, ein Thread, speed 10 und 6, quantizer 100); andere rav1e-Optionen waren nicht
Teil dieser Messung.
Ausführen
python3 tools/fetch_clips.py # lädt etwa 300 MB herunter, schreibt clips/ (283 MB), prüft SHA-256
tools/run_bench.sh # 5 Runden, beide Presets, beide Programme; etwa 20 Min. auf unserem Messstand
CPU=3 tools/run_bench.sh 3 # jede Kodierung an Kern 3 binden; 3 Runden
SPEEDS=10 tools/run_bench.sh 1 # kurzer Überblick: eine Runde mit speed 10 (etwa 1 Min.)
run_bench.sh gibt jede Kodierung, eine Tabelle der Mediane und Beschleunigungen sowie die Anzahl
identischer Ausgabepaare aus; weicht ein Paar ab, endet es mit Status 1. Takte werden angegeben, wenn
perf cycles:u zählen kann (andernfalls nur die Wall-Time). Die Rohdaten landen in runs.csv in
dem Arbeitsverzeichnis, das das Skript ausgibt. Beide Programme lassen sich auch direkt aufrufen, wie
eine normale rav1e-Kommandozeile:
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 # identisch
Voraussetzungen: Linux x86-64 mit glibc 2.34 oder neuer und eine CPU mit x86-64-v3 (AVX2, FMA, BMI2:
Intel Haswell und neuer, AMD Zen und neuer). Python 3.8+ für fetch_clips.py (nur
Standardbibliothek); perf ist optional.
Wie die Programme gebaut wurden
Beide auf dieselbe Weise: rustc 1.96.0, cargo build --release --locked --bin rav1e mit dem eigenen
Release-Profil von rav1e (Thin LTO) und den Standard-Features (einschließlich des NASM-Assemblercodes), -C target-cpu=x86-64-v3
-C debuginfo=0, Symbole entfernt. bin/rav1e-0.8.0 ist aus dem unveränderten rav1e-Quellcode beim
Git-Tag v0.8.0 (Commit 1fd67cd) gebaut; Sie können es
selbst bauen und vergleichen. bin/rav1e-0.8.0-takt ist aus demselben Quellcode nach der
TAKT-Optimierung gebaut. Der optimierte Quellcode wird nicht veröffentlicht: Wir liefern Builds.
Inhalt
bin/rav1e-0.8.0: unverändertes rav1e 0.8.0;bin/rav1e-0.8.0-takt: rav1e 0.8.0 nach der TAKT-Optimierung;tools/fetch_clips.py: lädt die fünf Clips von Xiph.org herunter und prüft ihre SHA-256;tools/run_bench.sh: führt beide Programme aus, vergleicht die Ausgaben, gibt die Zeiten aus;tools/expected_ivf.sha256: SHA-256 der zehn Ausgabedateien;measurements.json,SHA256SUMS,LICENSE,THIRD_PARTY_LICENSES.txt.
Lizenzen und Rechte an den Clips
rav1e wird unter der BSD 2-Clause License und der Alliance for Open Media Patent License 1.0
vertrieben; beide Programme werden zu denselben Bedingungen vertrieben (LICENSE), und der in sie
gelinkte Fremdcode ist in THIRD_PARTY_LICENSES.txt aufgeführt. Unsere Skripte stehen unter der
MIT-Lizenz.
Die Clips sind nicht Teil dieses Pakets: tools/fetch_clips.py lädt sie von Xiph.org herunter, und
es gelten weiterhin die dort genannten Bedingungen. Elephants Dream ist © Blender Foundation /
Netherlands Media Art Institute, lizenziert unter Creative Commons Attribution 2.5
(orange.blender.org). Park Joy stammt aus dem SVT-MultiFormat-Testsatz
(Sveriges Television; Bedingungen im
SVT-Dokument).
Johnny ist im Katalog von Xiph.org als gemeinfrei (Public Domain) gekennzeichnet. Bus und Stefan sind
Standard-Testsequenzen der Xiph.org-Sammlung, die deren ursprüngliche Quellen angibt.