# TAKTショーケース:rav1e 0.8.0、XiphテストクリップのAV1エンコード AV1エンコーダrav1e 0.8.0の2つのビルドです。標準のリリース版と、TAKTで最適化した同じエンコーダです。Xiph.orgの公開テストクリップ5本で、両者はバイト単位で同一のAV1ファイルを出力し、TAKTビルドはspeed 10で1.38倍、speed 6で1.30倍高速です(CPUサイクル数、シングルスレッド)。両プログラム、Xiph.orgからクリップをダウンロードするスクリプト、比較を実行するスクリプト、当社の測定結果を収録しています。 ## ベンチマークの内容 各クリップは、両プログラムで共通の1つのコマンドラインでエンコードします: ```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つでもあれば、終了ステータス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対応のCPU(AVX2、FMA、BMI2:Intel Haswell以降、AMD Zen以降)。`fetch_clips.py`にはPython 3.8以降が必要です(標準ライブラリのみ使用)。`perf`は任意です。 ## プログラムのビルド方法 両プログラムとも同じ方法でビルドしています:rustc 1.96.0、`cargo build --release --locked --bin rav1e`、rav1e独自のreleaseプロファイル(thin LTO)とデフォルトのfeature(NASMアセンブリを含む)、`-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コレクションの標準テストシーケンスで、元の出典は同コレクションに記載されています。