ARM的NEON技术,其基本原理是让处理器在每个时钟周期内完成更多工作。dav1d 0.3.1中,在解码1080p视频时,基于NEON开发的dav1d可以毫不费力地达到30 fps的流畅度。

文 / Ewout ter Hoeven

译 / John

原文

https://medium.com/@ewoutterhoeven/how-arms-neon-enables-efficient-av1-decoding-on-mobile-5fcb3a4f6e7f

多媒体解码是一项数据规模的挑战。解码几个像素对现代处理器来说小菜一碟,但当多媒体文件升级至每秒6200万像素的数据规模时,一般的处理器就会不堪重负。

因此,ARM的NEON技术应运而生。这项基于ARMv7与ARMv8指令集的扩展技术,其基本原理是让处理器在每个时钟周期内完成更多工作;同时,支持单指令多数据(SIMD)操作也令其在单个指令中不会一次性处理一个庞大或精确的数据,而是处理多个较小的数据。

NEON允许在单个指令中处理128位数据。几乎在所有情况下,128位都是精确有用的方法。如果我们有一个128位精度的坐标系,我们甚至可以在仙女座星系指定每个点且精确度可达0.00006皮米,这是什么概念呢?要知道最小的原子氢原子的直径也才32pm,而仙女座星系距离地球有250万光年!

很明显,如果是为了清晰且流畅呈现用户上传的视频,我们并不需要如此夸张的精确度,这也就是为什么在大多数情况下每个像素的色彩深度为8位,而若想实现HDR则需要10或12位的色彩深度。使用NEON则可通过将128位的数据精度拟合成每像素8或16位色彩深度,以防止出现路由错误。

总而言之,NEON可在单个操作中适应多个数据精度,且当视频解码器需要对大量数据进行处理时,使用NEON是一个不错的主意。

dav1d中的NEON

dav1d是由VideoLAN维护的AV1解码器,VideoLAN则是VLC媒体播放器、x264与x265视频编码器的主要推动者。很多开发人员为将此项目打造成可在几乎任何CPU上运行且处理速度最快的AV1视频编码器做出了不可磨灭的贡献。

回顾2018年12月的dav1d 0.1.0,我在不同规格的ARMv8处理器上比较基于C语言开发的dav1d与基于NEON汇编的dav1d(感谢Janne Grunau和MartinStorsjö提供的这些数据),尽管当时只有少数功能通过NEON加速,但性能仍相对于平均提高了80%。

有无NEON 代码对dav1d 0.1.0的影响

几个月后,更多基于NEON的应用逐渐出现。在得到最终结果之前,让我们先来探究一下哪些让NEON的性能如此出色。

功能及其加速

解码视频需要多个步骤,每个步骤由一项单独的函数执行,多个函数组合成视频解码处理流程;这些步骤也会根据编码器、参数与视频内容酌情增减修改。dav1d的开发人员严重依赖一个名为checkasm的工具以测试特定功能所需的时间。他们使用汇编语言编写代码并用checkasm测试,如果一些步骤的处理速度足够快那么它们就会被合并。

在MartinStorsjö的测试中,他使用了两个编译器(Clang 9和GCC 7)与三个不同的内核:Arm Cortex-A53、Arm Cortex-A72和Arm Cortex-A73。第一个是一般性能的有序核心,后两个是高性能的无序核心。

下表显示了当前基于NEON加速所有功能所得到的测试结果。其中的数字表示速度——基于C语言开发的dav1d带来了5秒钟的加速而基于NEON开发的dav1d则带来了2.5秒加速。

这张表的信息量远不止这些。首先,我们可以看到加速结果的分布区间非常广泛,从几个百分点到20+都涵盖在里面;其次我们还看到在大多数情况下,Clang编译器可以更好地优化基于C代码的dav1d(可以看到NEON的加速成绩更小);除此之外我们还可以发现,一般性能且有序的A53内核,其加速成绩比高性能且无序的A73内核高,而A73的效率又高于A72,其原因可能是前者的解码带宽降低。

需要明确的是,由于NEON的多项功能并非全部满负荷运行,这里的平均加速成绩并不能完全代表其整体性能。对于当前的NEON来说,其性能取决于核心和编译器。尽管计算加权平均值可以在一定程度上从侧面反映出大致性能水平,但每个视频(编码器、编码器设置、内容都不同)却存在很大差异。

但一般来说,基于NEON汇编语言形成的大多数函数,在性能优化方面会比基于编译器优化的C语言所形成的函数快4到5倍,在某些特殊情况之下可能会超过20倍。

dav1d 0.3.1性能

我将会从以下图表开始介绍:

测试此1080p视频我们可以观察到结果存在巨大差异:基于编译器优化的C语言(使用Clang)开发的dav1d,其在Apple A7与Snapdragon 835平台甚至无法达到24 fps的帧率,而基于NEON开发的dav1d可以毫不费力地达到30 fps的流畅度,而Apple A10则从45 fps跃升至100 fps以上。如此性能提升对于移动设备来说意味着更低的功耗与更高效的资源利用。

如果将结果标准化,我们可以仔细查看确切的加速成果:

Snapdragon 835中的Cortex-A73所获得的加速最为明显,几乎是基准的3倍。其他核心平均值略低,为基准的2.5倍。这意味着从基于优化后的C语言开发的dav1d所实现的1倍性能提升到基于NEON开发的dav1d 0.1.0所实现的1.8倍性能提升,再到dav1d 0.3.1高达2.5倍的性能提升,NEON的优化成果十分显著。

展望未来

dav1d的Arm64开发还远未完成,现在需要实现的最重要功能是提高移动端的NEON整合速度(同时推广用于PC的AVX2和SSSE3),发展空间巨大。我们希望可实现比平均基准三倍以上的性能优化,同时更好的自动矢量化也可提供很多帮助,但主要的驱动程序仍然需要开发者的智慧和勤奋。

LiveVideoStack  招募

LiveVideoStack正在招募编辑/记者/运营,与全球顶尖多媒及技术专家和LiveVideoStack年轻的伙伴一起,推动多媒体技术生态发展。了解岗位信息请在BOSS直聘上搜索“LiveVideoStack”,或通过微信“Tony_Bao_”与主编包研交流。

LiveVideoStackCon 2019北京正在招募讲师,无论你是技术派还是学术派,亦或是行业专家,无论你的团队有多小、有多新,都可以来申请成为LiveVideoStackCon的讲师。点击【阅读原文】了解更多大会相关信息。

NEON技术如何实现移动端视频高效解码AV1?相关推荐

  1. 被压缩的视觉:视频编解码技术

    视觉是人类获得信息的主要方式,每天有大量的视频信息被生产并传输.未经压缩的视频内容占用的存储空间和传输带宽十分巨大,以常见的30fps高清视频为例,采用avi格式存储的YUV420视频流一分钟就有2G ...

  2. 全面解析视频编解码:原理、策略、实现

    远程桌面,本质就是将桌面进行连续截屏.编码压缩,经网络传输后,再解码还原成画面的过程.可见编解码技术在其中扮演了举足轻重的作用. 继上一篇介绍了远程桌面的五大核心指标后,本篇我们将揭秘高质量远程桌面的 ...

  3. QoE驱动的端到端视频直播技术演进

    从ROI视频编码.网络自适应,到海量多媒体存储,以及高可用CDN网络架构,这些关键技术决定了视频服务的用户体验.京东云蛰伏多年,在5G和AI时代蓄势待发,剑指视频云价值链上的新领导者. 8月23日·北 ...

  4. 美团外卖商家端视频探索之旅

    美团外卖商家端视频探索之旅 背景 美团外卖至今已迅猛发展了六年,随着外卖业务量级与日俱增,单一的文字和图片已无法满足商家的需求,商家迫切需要更丰富的商品描述手段吸引用户,增加流量,进而提高下单转化率和 ...

  5. 直播技术——视频编解码(理论基础)

    摘自:https://www.cnblogs.com/xkfz007/archive/2012/08/12/2613690.html 第1章介绍 1. 为什么要进行视频压缩? 未经压缩的数字视频的数据 ...

  6. 音视频编解码技术之视频编码基本概念介绍

    视频压缩名字解释: 1.有损和无损压缩:在视频压缩中有损(Lossy )和无损(Lossless)的概念与静态图像中基本类似.无损压缩也即压缩前和解压缩后的数据完全一致.有损压缩意味着解压缩后的数据与 ...

  7. 流媒体传输协议及音视频编解码技术

    说明:本文来自一篇出处不明的老文章,有些内容已过时,但仍有很大的参考价值. 一.音视频编解码技术 1.MPEG4 MPEG全称是Moving Pictures Experts Group,它是&quo ...

  8. 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等

    本文来自腾讯QQ技术团队工程师许灵锋.周海发的技术分享. 一.引言 自 2015 年春节以来,QQ 春节红包经历了企业红包(2015 年).刷一刷红包(2016 年)和 AR 红包(2017 年)几个 ...

  9. 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等...

    本文来自腾讯QQ技术团队工程师许灵锋.周海发的技术分享. 一.引言 自 2015 年春节以来,QQ 春节红包经历了企业红包(2015 年).刷一刷红包(2016 年)和 AR 红包(2017 年)几个 ...

最新文章

  1. python与MySQL交互
  2. linux qt libusb,Ubuntu15下Qt+libusb开发
  3. 4.9一个简单的多任务内核实例
  4. dmg文件 linux,安装和使用Dmg2Img在Linux上创建macOS安装盘
  5. [考试]20150528
  6. boost::hana::all用法的测试程序
  7. PAT (Advanced Level) 1007 Maximum Subsequence Sum(最大连续子段和)
  8. css 图片剪裁居中
  9. 从一个实际的例子触发,理解什么是 Rxjs 的 defer 函数
  10. 九度 1376 最近零子序列
  11. Spring JPA
  12. Netty粘包拆包问题说明、演示拆包粘包情况代码以及解决
  13. lwip 数据处理流程
  14. 深度剖析阿里巴巴对Apache Flink的优化与改进
  15. 2023南京航空航天大学计算机考研信息汇总
  16. PDF怎样免费转换成word?无须借助软件,网页就能轻松实现。
  17. wine: /home/cpr/.wine is not owned by you
  18. cai鸡——处女作博客“横空出世”
  19. RHEL8红帽子系统 网卡命令
  20. 群体创新技术/群体决策的几种类型

热门文章

  1. 如何鉴定游戏音乐的音质?
  2. 真正认识到自己的身躯
  3. 重磅:CACTER邮件安全网关荣膺2023数字中国创新大赛·华南赛区-三等奖
  4. Mikrotik RouterOS安全性指南
  5. 吉哥系列故事——礼尚往来(简单容斥问题)
  6. 火锅店选址如何用大数据软件了解商圈内用户画像,交通情况
  7. 运用ChitGPT AI大模型生成杨氏双缝干涉实验MATLAB代码
  8. python默认路径安装第三方包错误问题:ERROR: Cannot determine archive format of XXX
  9. JavaScript - js进阶 - ES6面向对象
  10. 阿里员工:最惨P7,33岁才28K,前景堪忧啊!!