← torna alla vetrina

Vetrina TAKT: rav1e 0.8.0, codifica AV1 delle clip di test Xiph

Due build dell’encoder AV1 rav1e, versione 0.8.0: la release originale e lo stesso encoder dopo l’ottimizzazione TAKT. Su cinque clip di test pubbliche di Xiph.org entrambe scrivono gli stessi file AV1, byte per byte, e la build TAKT è 1,38× più veloce a speed 10 e 1,30× più veloce a speed 6 (cicli di CPU, un thread). Qui si trovano i due programmi, uno script che scarica le clip da Xiph.org, uno script che esegue il confronto e le nostre misure.

Che cosa fa il benchmark

Ogni clip viene codificata con una sola riga di comando, identica per entrambi i programmi:

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 è il preset più veloce di rav1e, speed 6 quello predefinito. Le clip sono i primi 64 fotogrammi dei file Y4M originali a 8 bit 4:2:0 della collezione Xiph.org Video Test Media, invariati (nessun ridimensionamento, nessuna ricodifica):

Clip Risoluzione, frequenza dei fotogrammi Contenuto File sorgente su Xiph.org
Elephants Dream 1280×720, 24 fps animazione 3D elephants_dream_720p24.y4m.xz
Park Joy 1280×720, 50 fps persone e vegetazione in un parco park_joy_420_720p50.y4m
Johnny 1280×720, 60 fps mezzobusto parlante Johnny_1280x720_60.y4m
Bus 352×288 (CIF), 30 fps autobus e traffico stradale bus_cif.y4m
Stefan 352×240 (SIF), 29,97 fps tennista stefan_sif.y4m

Misura (banco TAKT)

AMD Threadripper PRO 5975WX (Zen 3), Linux. Un core dedicato, il resto del suo core complex mantenuto inattivo; cicli e istruzioni in modalità utente da perf stat, più il tempo reale. 7 round alternati: in ogni round ciascuna clip viene codificata da entrambi i programmi uno dopo l’altro, prima l’originale nei round dispari e prima TAKT nei round pari; si prende la mediana per clip e per programma. L’accelerazione per un preset è la somma delle cinque mediane dell’originale divisa per la somma delle cinque mediane di TAKT. Sono stati misurati esattamente i file in bin/, con tools/run_bench.sh.

Preset Originale, mld di cicli TAKT, mld di cicli Accelerazione, cicli Originale, s TAKT, s Accelerazione, tempo
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×

Per clip (accelerazione in cicli; in tempo reale tra parentesi):

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×)

L’accelerazione minima per clip è 1,28× in cicli (Elephants Dream, speed 6). Tutti i campioni, le mediane e i conteggi delle istruzioni sono in measurements.json.

Equivalenza

Su questo benchmark la build TAKT scrive esattamente lo stesso bitstream di rav1e originale: in ogni round tutte e dieci le codifiche (5 clip × 2 preset) sono state confrontate byte per byte, 70 coppie in totale, 70 identiche. Lo SHA-256 di ciascun file di output è in tools/expected_ivf.sha256; tools/run_bench.sh verifica i suoi output rispetto a questi valori. Questa vetrina copre la configurazione indicata sopra (input a 8 bit 4:2:0, un thread, speed 10 e 6, quantizer 100); altre opzioni di rav1e non facevano parte di questa misura.

Esecuzione

python3 tools/fetch_clips.py              # scarica circa 300 MB, scrive clips/ (283 MB), verifica SHA-256
tools/run_bench.sh                        # 5 round, entrambi i preset, entrambi i programmi; circa 20 min sul nostro banco
CPU=3 tools/run_bench.sh 3                # fissa ogni codifica sul core 3; 3 round
SPEEDS=10 tools/run_bench.sh 1            # uno sguardo rapido: un round a speed 10 (circa 1 min)

run_bench.sh stampa ogni codifica, una tabella di mediane e accelerazioni e quante coppie di output sono identiche; termina con stato 1 se una qualsiasi coppia differisce. I cicli vengono riportati quando perf può contare cycles:u (altrimenti solo il tempo reale). I dati grezzi finiscono in runs.csv nella directory di lavoro che lo script stampa. Ciascun programma si può anche eseguire direttamente, come una normale riga di comando di 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                 # identici

Requisiti: Linux x86-64 con glibc 2.34 o successiva e una CPU con x86-64-v3 (AVX2, FMA, BMI2: Intel Haswell e successivi, AMD Zen e successivi). Python 3.8+ per fetch_clips.py (solo libreria standard); perf è facoltativo.

Come sono stati compilati i programmi

Entrambi allo stesso modo: rustc 1.96.0, cargo build --release --locked --bin rav1e con il profilo release di rav1e (thin LTO) e le feature predefinite (compreso il suo assembly NASM), -C target-cpu=x86-64-v3 -C debuginfo=0, simboli rimossi. bin/rav1e-0.8.0 è compilato dal sorgente non modificato di rav1e al tag git v0.8.0 (commit 1fd67cd); può compilarlo in autonomia e confrontarlo. bin/rav1e-0.8.0-takt è compilato dallo stesso sorgente dopo l’ottimizzazione TAKT. Il sorgente ottimizzato non è pubblicato: consegniamo build.

Contenuto

Licenze e diritti sulle clip

rav1e è distribuito con la BSD 2-Clause License e la Alliance for Open Media Patent License 1.0; entrambi i programmi sono distribuiti alle stesse condizioni (LICENSE), e il codice di terze parti collegato al loro interno è elencato in THIRD_PARTY_LICENSES.txt. I nostri script sono rilasciati con la MIT License.

Le clip non fanno parte di questo pacchetto: tools/fetch_clips.py le scarica da Xiph.org e restano soggette alle condizioni lì indicate. Elephants Dream è © Blender Foundation / Netherlands Media Art Institute, con licenza Creative Commons Attribution 2.5 (orange.blender.org). Park Joy proviene dal set di test SVT MultiFormat (Sveriges Television; condizioni nel documento SVT). Johnny è indicato come pubblico dominio nel catalogo di Xiph.org. Bus e Stefan sono sequenze di test standard della collezione Xiph.org, che ne elenca le fonti originali.

Testo sorgente: README.it.md

Telegram