# 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 下载片段的脚本、运行对比的脚本以及我们的测量数据。 ## 基准测试的内容 每个片段用一条命令行编码,两个程序的命令行完全相同: ```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。一个专用核心,其所在核心复合体(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 的其他选项不在本次测量范围内。 ## 运行 ```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 分钟) ``` `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 # 完全一致 ``` 要求: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](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 下载五个片段并校验其 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](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 合集中的标准测试序列,该合集列出了它们的原始来源。