TAKT 案例展示:rav1e 0.8.0,Xiph 测试片段的 AV1 编码
rav1e AV1 编码器 0.8.0 版的两个构建:官方原版,以及经 TAKT 优化后的同一编码器。在五个公开的 Xiph.org 测试片段上,两者输出的 AV1 文件逐字节一致,而 TAKT 构建在 speed 10 下提速 1.38×,在 speed 6 下提速 1.30×(CPU 时钟周期,单线程)。本包提供这两个程序、从 Xiph.org 下载片段的脚本、运行对比的脚本以及我们的测量数据。
基准测试的内容
每个片段用一条命令行编码,两个程序的命令行完全相同:
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。一个专用核心,其所在核心复合体(CCX)的其余核心保持空闲;用户态时钟周期和指令数来自 perf stat,另记录墙钟时间。7 轮交替测量:每一轮中,每个片段都由两个程序先后连续编码,奇数轮先运行原版,偶数轮先运行 TAKT 构建;对每个片段和程序取中位数。某一预设的加速等于五个原版中位数之和除以五个 TAKT 中位数之和。所测文件正是 bin/ 中的文件,测量使用 tools/run_bench.sh。
| 预设 | 原版(十亿周期) | TAKT(十亿周期) | 加速(按周期) | 原版(s) | TAKT(s) | 加速(按时间) |
|---|---|---|---|---|---|---|
| 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 完全相同:每一轮中,全部十次编码(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 分钟)
run_bench.sh 会打印每次编码、中位数与加速表,以及有多少对输出一致;只要有任何一对不同,它就以状态 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 # 完全一致
要求:Linux x86-64,glibc 2.34 或更新版本,CPU 支持 x86-64-v3(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)和默认特性(包括其 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 优化后的同一源代码构建。优化后的源代码不公开:我们交付的是构建产物。
包内容
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 下载五个片段并校验其 SHA-256;tools/run_bench.sh:运行两个程序,比对输出,打印计时;tools/expected_ivf.sha256:十个输出文件的 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)。Park Joy 来自 SVT MultiFormat 测试集(Sveriges Television;条款见 SVT 文档)。Johnny 在 Xiph.org 目录中标注为公有领域。Bus 和 Stefan 是 Xiph.org 合集中的标准测试序列,该合集列出了它们的原始来源。