# TAKT 쇼케이스: rav1e 0.8.0, Xiph 테스트 클립 AV1 인코딩 AV1 인코더 rav1e 0.8.0의 두 가지 빌드입니다. 하나는 공식 릴리스이고, 다른 하나는 TAKT 최적화를 거친 같은 인코더입니다. 공개된 Xiph.org 테스트 클립 5개에서 두 빌드는 바이트 단위로 동일한 AV1 파일을 생성하며, TAKT 빌드는 speed 10에서 1.38배, speed 6에서 1.30배 빠릅니다(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은 기본값입니다. 클립은 [Xiph.org Video Test Media](https://media.xiph.org/video/derf/) 컬렉션의 원본 8비트 4:2:0 Y4M 파일에서 처음 64프레임을 변경 없이(크기 조정이나 재인코딩 없이) 잘라 낸 것입니다: | 클립 | 프레임 크기, 프레임률 | 내용 | Xiph.org 원본 파일 | |---|---|---|---| | Elephants Dream | 1280×720, 24 fps | 3D 애니메이션 | `elephants_dream_720p24.y4m.xz` | | Park Joy | 1280×720, 50 fps | 공원의 사람들과 나뭇잎 | `park_joy_420_720p50.y4m` | | Johnny | 1280×720, 60 fps | 말하는 인물(토킹 헤드) | `Johnny_1280x720_60.y4m` | | Bus | 352×288 (CIF), 30 fps | 버스와 도로 교통 | `bus_cif.y4m` | | Stefan | 352×240 (SIF), 29.97 fps | 테니스 선수 | `stefan_sif.y4m` | ## 측정 (TAKT 측정 장비) AMD Threadripper PRO 5975WX (Zen 3), Linux. 전용 코어 1개를 사용하고 같은 코어 컴플렉스의 나머지 코어는 유휴 상태로 유지했습니다. `perf stat`으로 사용자 모드 사이클과 명령어 수를, 그리고 실제 경과 시간을 측정했습니다. 교차 실행 7라운드: 각 라운드에서 모든 클립을 두 프로그램으로 연달아 인코딩하며, 홀수 라운드에서는 공식 빌드를, 짝수 라운드에서는 TAKT 빌드를 먼저 실행합니다. 클립과 프로그램별로 중앙값을 구합니다. 프리셋별 가속은 공식 빌드 중앙값 5개의 합을 TAKT 중앙값 5개의 합으로 나눈 값입니다. `bin/`의 파일을 그대로 `tools/run_bench.sh`로 측정했습니다. | 프리셋 | 공식 빌드(10억 사이클) | TAKT(10억 사이클) | 가속(사이클) | 공식 빌드(초) | 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와 정확히 같은 비트스트림을 생성합니다. 모든 라운드에서 인코딩 결과 10개(클립 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 MB를 내려받아 clips/(283 MB)를 생성하고 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라운드(약 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 # 동일 ``` 요구 사항: glibc 2.34 이상의 Linux x86-64, x86-64-v3(AVX2, FMA, BMI2: Intel Haswell 이후, AMD Zen 이후)를 지원하는 CPU. `fetch_clips.py`에는 Python 3.8 이상이 필요합니다(표준 라이브러리만 사용). `perf`는 선택 사항입니다. ## 프로그램 빌드 방법 두 프로그램 모두 같은 방법으로 빌드했습니다: rustc 1.96.0, rav1e 자체 release 프로필(thin LTO)과 기본 기능(NASM 어셈블리 포함)으로 `cargo build --release --locked --bin rav1e`, `-C target-cpu=x86-64-v3 -C debuginfo=0`, 심볼 제거. `bin/rav1e-0.8.0`은 git 태그 [v0.8.0](https://github.com/xiph/rav1e/tree/v0.8.0) (커밋 1fd67cd)의 수정하지 않은 rav1e 소스로 빌드했으며, 직접 빌드해 비교할 수 있습니다. `bin/rav1e-0.8.0-takt`는 같은 소스를 TAKT로 최적화한 뒤 빌드했습니다. 최적화된 소스는 공개하지 않습니다. 저희는 빌드를 제공합니다. ## 구성 - `bin/rav1e-0.8.0`: 공식 rav1e 0.8.0 - `bin/rav1e-0.8.0-takt`: TAKT 최적화를 거친 rav1e 0.8.0 - `tools/fetch_clips.py`: Xiph.org에서 클립 5개를 내려받고 SHA-256을 검사 - `tools/run_bench.sh`: 두 프로그램을 실행하고 출력을 비교하며 시간을 출력 - `tools/expected_ivf.sha256`: 출력 파일 10개의 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 License를 따릅니다. 클립은 이 패키지에 포함되어 있지 않습니다. `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 카탈로그에 퍼블릭 도메인으로 표시되어 있습니다. Bus와 Stefan은 Xiph.org 컬렉션의 표준 테스트 시퀀스이며, 원래 출처는 컬렉션에 기재되어 있습니다.