← 返回案例展示

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 优化后的同一源代码构建。优化后的源代码不公开:我们交付的是构建产物。

包内容

许可证与片段版权

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.zh.md

Telegram