新知一下
海量新知
5 9 8 5 6 5 7

视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

微架构与高性能计算杂 | 高性能现代处理器杂谈与主流处理 2019/09/15 18:29

在之前的文章,介绍了HEVC即H265的全新编码标准,这是流行度极高的H264编码的新接班人,但是该编码格式已经不算新面孔了,VP9,尤其是AV1,是更加新颖的编码标准,AV1是由开放媒体视频联盟(Alliance of Open Media Video,AOM)开发的下一代视频编码格式。其最大的特点是开放和免授权版税,目标为取代谷歌的VP9,并与H.265 HEVC竞争。AV1的目标是在VP9/HEVC的基础上提高相同质量下再高30%的编码效率(不是编码相同质量下的速度而是编码压缩效率)。

AV1编码简介

首先,AV1在刚刚推出时,速度效率极低,FFmpeg社区在2018年4月推出了对AV1编码的支持,视频压缩专家Jan Ozer对AV1进行了测试,AV1展示出极端的特性——考虑编码速度下的效率极低,但可以节省1/3的码率。

Jan在文章中表示:使用AV1默认的速度预设,在48核HP Z840工作站上进行了5秒钟的Tears of Steel 1080p源素材编码需要23小时46分钟(1,426分钟)。也就是说,编码一分钟的1080p视频需要285小时。相比之下,使用“veryslow”预设的x265编码大约需要3分钟,使用speed 0设置(最高质量)的VP9大约需要2分钟,使用“veryslow”预设的H.264需要10秒。因此,在这个简单的试验中,AV1比x265长475倍,比VP9长713倍,比H.264长约8,500倍。

编码效率方面,在同等的PSNA和VMAF质量下,AV1比HEVC的确有效果,达到了36.58%的码率节省。而在之后,AV1编码的效率开始了持续优化之路,其目标为在相近质量下,编码速度为VP9的1/10以上,也就是VP9的速度应当不超过AV1的10倍。而优化任务首先便从Intel,NVIDIA,ARM等硬件公司开始,并包括了众多互联网公司(尤其是视频网站)。互联网公司(尤其是视频网站)更多会结合自身业务进行优化

AV1有大量来自VP10的代码,其主要目的是支持更高的比特率,更宽的色彩空间,更高的码率压缩为浏览器直接播放4K 60fps视频提供支持,其次是为WebRTC提供一套高可用的编码算法。

VP9编码简介

相比AV1的开放阵容,VP9要单纯的多,VP9是谷歌开发的开放开源编码标准,其目的是在相同质量下,相比VP8降低50%的码率(视频体积缩小为原来一半),并争取能在效率上追赶H265/HEVC,不过H265也相对H264,在相同质量下降低了50%的码率,所以VP9想要战胜H265并不容易,所以谷歌已经在着手开发VP10编码标准,在VP9的基础上进一步将编码效率提高,做到相同质量下比VP9再次节省50%的码率。VP9有两种格式设定,Profile 0支持YUV 4:2:0的色度抽样,Profile 1支持YUV 4:2:0、4:2:2和4:4:4色度抽样,之后,又增加了10bit色深的编码支持

目前在谷歌旗下的浏览器和视频内容产品下均支持VP9编解码的视频内容,通过谷歌内核浏览器便可使用VP9解码器浏览YouTube的视频资源。最新的GPU也基本都支持了4K VP9 10bit的硬解码。

SVT编码器

SVT编码器是Intel正在开发和维护的开源可扩展编码器系列,其包含了HEVC,VP9和AV1等多种标准的编码功能,并为X86体系处理器,尤其是支持AVX2指令以上的X86处理器优化,具备可扩展性和向量化优化,是一种由硬件公司主导的高性能开源编码器方案,AV1编码器目前还处在早期运用阶段,有诸多不成熟之处,目前SVT-AV1 0.6.0,有初始AV1解码支持,能够充当静态库,自适应QP缩放,支持磁贴和10bit解码,支持分段,各种SIMD优化,以及其他一些新功能和修复/改进。

SVT-VP9 0.10编码器针对Xeon可扩展处理器产品进行了优化,可发挥双路至强可扩展处理器系列的超多线程的性能,并且支持SIMD扩展功能。

SVT-AVI编码-输入视频格式

SVT-AV1编码器支持以下输入格式:

8bit YUV420p 4:2:0

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

10bit yuv420p 10le 4:2:0

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

压缩10bit视频格式进行编码

为了减小输入原始YUV文件的大小,SVT-AV1编码器使用压缩的10位格式,允许软件实现更高的速度和通道密度水平。10位yuv420p10le与压缩的10位格式之间的转换是无损操作,并使用以下步骤执行。

首先打开10位图片的封装,此步骤包括将10位视频采样分成8位和2位平面,以便每个10位图像将表示为两个单独的图像,如下图所示。作为操作的结果,10位的2个最低有效位将被写入完整字节。

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

然后压缩2位平面,解包步骤将10bit分成一组8bit和一组2bit,其中2bit存储在一个字节中。在该步骤中,每组连续的4个字节(每个包含来自解包步骤的2个比特)被压缩成一个字节。结果,每个10bit图像将表示为两个单独的图像,如下图所示。

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

接下来展开图像64x64块,现在为了更快地读取样本,应将2位图像的每个64x64块写入一维阵列。因此,在压缩2位采样后,现在写16字节x64字节的左上方64x64采样块将写1024字节x1字节数组,如下图所示。

2位压缩后64x64块              右为展开后64x64块

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

而SVT-VP9的压缩编码输入也基本类似,不过SVT-VP9目前仅支持8bit Yuv420p 4:2:0的编码压缩格式,而在编码过程中,依旧与HEVC类似,分区块优化后,进行比特流编码,每一帧编码组成:

1,未压缩的标题:十几个字节,包含像图片大小,循环过滤器强度等;

2,压缩标头:传输用于帧的 Bool 编码部分;

3,压缩帧数据(布尔编码数据):重建帧所需的数据,包含宏块分区大小,运动矢量,帧内模式和变换系数。

通过帧内预测与帧间预测对相邻和同一帧内的运动差异,描述其每一帧的各个区块是如何移动到某个其他位置上去的,减少视频序列的空间冗余(也就是一些视频的静态画面实际上每帧间的变化很小,有很强的的相关性,如果都进行直接编码会带来大量冗余)。

4,最后是残差信号编码: VP9 支持四种变换大小:32x32、16x16、8x8 和 4x4。这些变换与其他大多数编码一样,是 DCT 的近似整数。在帧内编码宏块中,垂直和水平变换路径中的一者或两者会是 DST(离散正弦变换)。

构建SVT编码器

开源项目自然少不了构建项目编译链接库和可执行文件,代码均托管于Github,直接下载并不困难:

而在Windows上构建并非难事,只需要准备安装好Cmake构建工具,准备一个YASM编译链接工具即可,而一个Visual Stduio IDE以及相应编译器自然也是需要的,当工具准备就绪之后,构建非常简单,甚至是批处理直接运行的,在完成构建后,打开SVT-VP9.Sln以及SVT-AV1.Sln文件即可。选择release加X64直接开始编译生成便可获得可执行文件Svtvp9encapp.exe/Svtav1encapp.exe

以及Svtvp9enc.dll/Svtav1enc.dll的动态连接扩展文件,AVI的项目部分还包括能获得一个解码器Ssvtav1dncapp.exe/Svtav1dnc.dll

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

开启AVX512功能?

无论是VP9还是AV1,SVT编码器都默认关闭了AVX512的使用,编译出来的文件都将最高以AVX2指令执行,在VP9代码中,需找到定义文件Ebdefinitions.h,将默认的#define DISABLE_AVX512注释掉

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

EbCombinedAveragingSAD_Intrinsic_AVX512.c和EbComputeSAD_SadLoopKernel_AVX512.c两个文件的AVX512代码将生效并运行,

而AV1同样需要修改定义,将Ebdefinitions.h默认的#define NON_AVX512_SUPPORT注释掉,才能使用AVX512优化文件。

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

如上图所示,这样便可开启ASM_AVX512文件下的内容,但如下图所示,实际开放的AVX512功能极少,对比AVX2文件实在也是非常寒酸,而且目前还存在性能问题。而且目前直接调用Intel编译器运行还会报错,所以AV1编码器我们还是使用MSVC编译器进行编译,使用-O2优化选项,开启增强指令集Arch-AVX2选项,Intel MPI支持。

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

另外,在VP9编码器中,正常运行了Intel编译器编译,所以还会对比Intel ICC19 UP4编译器与MSVC编译器在VP9的编码性能。

实测最新桌面处理器运行性能

又到了喜闻乐见的实测环节,我又将桌面目前常见的三大X86高性能产品请了出来,他们是代表Skylake-Client微架构的9900KF,Skylake-Server微架构的9900X和代表Matisee的Zen2处理器R7 3700X。

3700X单核实际运行在4.36Ghz左右,全部核心多线程频率在4.25Ghz左右。

9900KF单核运行在5Ghz左右,全部核心多线程频率4.7Ghz。

9900X单核实际运行在4.25Ghz(SSE)左右,标称AVX单核频率3.9Ghz,AVX512频率3.7Ghz,全部核心多线程频率4.1Ghz(SSE),AVX频率3.8Ghz,AVX512频率3.4Ghz。

它们都将配备4条32GB DDR4 3600Mhz(时序17-18-18-38)的内存(此时9900X为四通道内存配置)和Windows10 1903最新更新版(9月补丁以及更新)的系统,视频编码主要为整数型计算,8bit和16bit整数计算较多,考验的是整数型SIMD效率。

AV1 1080P编码实测

在采用速度最快的Encoder mode=7(0质量最高,最慢,7最快)的情况下,1920X1080分辨率8bit模式下,速度极慢,参与测试的CPU均不超过10fps

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

而AVX512模式下出现了性能负面收益,9900KF甚至不敌3700X,存在一定程度AVX512 Offset情况,且实际提升幅度过小,没能弥补offset带来的负面影响,显然,AVX512目前不适合于SVT-AV1编码。且AMD处理器拥有优势。即使是官方维护者也表明AVX512性能更弱的事实

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

VP9 1080P编码实测

而在VP9编码中,速度明显可以更快,将编码质量提高以便提高多线程CPU的利用率,且使用Intel编译器后无论是AVX512还是AVX2版本快于MSVC编译器,AVX512性能会提升幅度超过AVX2的提高速度。9900KF也顺利战胜了3700X,而9900X AVX512相对AVX2,MSVC下提升2%,Intel编译器下提升5.1%。

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

半吞吐AVX512执行效率?

i9 9900X为全吞吐的AVX512处理器,但实际上,整数SIMD计算,半吞吐的AVX512处理器只有整数乘法SIMD会相对减半,整数型逻辑计算,整数型加法/减法计算都不会影响而我正好有一款半吞吐处理器,i3-8121U,但问题在于,i3-8121U的TDP仅有15瓦,长时间运行必然出现被15瓦功耗限制的问题,所以这不仅考验AVX512能否提升,还要考虑执行AVX512带来功耗提升的情况下,能否带来能耗比的提升

新知达人, 视频编码新形势,CPU可扩展编码器SVT-AVI与VP9编码器简介和性能实测

总的来说基本是非常接近的表现,由于本身8121U性能较弱,所以成绩本身就有误差,可以视为几乎一个水平,使用MSVC+AVX2的配合对于低性能低压CPU来说没有什么问题,不需要特意调优AVX512或者使用Intel编译器,能耗可以视为一致。

结论

VP9在编码速度上要快AV1很多,AV1目前还有很大优化空间,主要优势还是在于节约编码的码率,但时间开销较大,同时AVX512支持差到倒退的地步,说明其未来还需要很大的优化力度,VP9更成熟,整体效果较好,AVX512提升是HEVC,VP9和AV1里最好的,目前X265下9900X AVX512与AVX2基本相当,VP9 9900X AVX512可以比AVX2快5%,而AV1要下降6%。Intel处理器在VP9相对AMD Zen2处理器有优势,但在AV1的编码上存在一定的明显劣势

更多“CPU”相关内容

更多“CPU”相关内容

新知精选

更多新知精选