← ショーケースに戻る

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つのコマンドラインでエンコードします:

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はrav1eの最速プリセット、speed 6はデフォルトです。クリップは、Xiph.org Video Test Mediaコレクションに収録された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のその他のオプションは今回の測定に含まれていません。

実行方法

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のコマンドラインとして直接実行できます:

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(コミット1fd67cd)の未変更のrav1eソースからビルドしたもので、ご自身でビルドして比較できます。bin/rav1e-0.8.0-taktは、同じソースをTAKTで最適化してからビルドしたものです。最適化後のソースコードは公開していません。当社が納品するのはビルドです。

収録内容

ライセンスとクリップの権利

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)。Park JoyはSVT MultiFormatテストセットに含まれるクリップです(Sveriges Television。条件はSVTの文書を参照)。JohnnyはXiph.orgのカタログでパブリックドメインと表示されています。BusとStefanはXiph.orgコレクションの標準テストシーケンスで、元の出典は同コレクションに記載されています。

ソースファイル: README.ja.md

Telegram