ARM的NEON技術(shù),其基本原理是讓處理器在每個時鐘周期內(nèi)完成更多工作。dav1d 0.3.1中,在解碼1080p視頻時,基于NEON開發(fā)的dav1d可以毫不費力地達到30 fps的流暢度。
多媒體解碼是一項數(shù)據(jù)規(guī)模的挑戰(zhàn)。解碼幾個像素對現(xiàn)代處理器來說小菜一碟,但當(dāng)多媒體文件升級至每秒6200萬像素的數(shù)據(jù)規(guī)模時,一般的處理器就會不堪重負。
因此,ARM的NEON技術(shù)應(yīng)運而生。這項基于ARMv7與ARMv8指令集的擴展技術(shù),其基本原理是讓處理器在每個時鐘周期內(nèi)完成更多工作;同時,支持單指令多數(shù)據(jù)(SIMD)操作也令其在單個指令中不會一次性處理一個龐大或精確的數(shù)據(jù),而是處理多個較小的數(shù)據(jù)。
NEON允許在單個指令中處理128位數(shù)據(jù)。幾乎在所有情況下,128位都是精確有用的方法。如果我們有一個128位精度的坐標(biāo)系,我們甚至可以在仙女座星系指定每個點且精確度可達0.00006皮米,這是什么概念呢?要知道最小的原子氫原子的直徑也才32pm,而仙女座星系距離地球有250萬光年!
很明顯,如果是為了清晰且流暢呈現(xiàn)用戶上傳的視頻,我們并不需要如此夸張的精確度,這也就是為什么在大多數(shù)情況下每個像素的色彩深度為8位,而若想實現(xiàn)HDR則需要10或12位的色彩深度。使用NEON則可通過將128位的數(shù)據(jù)精度擬合成每像素8或16位色彩深度,以防止出現(xiàn)路由錯誤。
總而言之,NEON可在單個操作中適應(yīng)多個數(shù)據(jù)精度,且當(dāng)視頻解碼器需要對大量數(shù)據(jù)進行處理時,使用NEON是一個不錯的主意。
dav1d中的NEON
dav1d是由VideoLAN維護的AV1解碼器,VideoLAN則是VLC媒體播放器、x264與x265視頻編碼器的主要推動者。很多開發(fā)人員為將此項目打造成可在幾乎任何CPU上運行且處理速度最快的AV1視頻編碼器做出了不可磨滅的貢獻。
回顧2018年12月的dav1d 0.1.0,我在不同規(guī)格的ARMv8處理器上比較基于C語言開發(fā)的dav1d與基于NEON匯編的dav1d(感謝Janne Grunau和MartinStorsj?提供的這些數(shù)據(jù)),盡管當(dāng)時只有少數(shù)功能通過NEON加速,但性能仍相對于平均提高了80%。
有無NEON 代碼對dav1d 0.1.0的影響
幾個月后,更多基于NEON的應(yīng)用逐漸出現(xiàn)。在得到最終結(jié)果之前,讓我們先來探究一下哪些讓NEON的性能如此出色。
功能及其加速
解碼視頻需要多個步驟,每個步驟由一項單獨的函數(shù)執(zhí)行,多個函數(shù)組合成視頻解碼處理流程;這些步驟也會根據(jù)編碼器、參數(shù)與視頻內(nèi)容酌情增減修改。dav1d的開發(fā)人員嚴(yán)重依賴一個名為checkasm的工具以測試特定功能所需的時間。他們使用匯編語言編寫代碼并用checkasm測試,如果一些步驟的處理速度足夠快那么它們就會被合并。
在MartinStorsj?的測試中,他使用了兩個編譯器(Clang 9和GCC 7)與三個不同的內(nèi)核:Arm Cortex-A53、Arm Cortex-A72和Arm Cortex-A73。第一個是一般性能的有序核心,后兩個是高性能的無序核心。
下表顯示了當(dāng)前基于NEON加速所有功能所得到的測試結(jié)果。其中的數(shù)字表示速度——基于C語言開發(fā)的dav1d帶來了5秒鐘的加速而基于NEON開發(fā)的dav1d則帶來了2.5秒加速。
這張表的信息量遠不止這些。首先,我們可以看到加速結(jié)果的分布區(qū)間非常廣泛,從幾個百分點到20+都涵蓋在里面;其次我們還看到在大多數(shù)情況下,Clang編譯器可以更好地優(yōu)化基于C代碼的dav1d(可以看到NEON的加速成績更?。?;除此之外我們還可以發(fā)現(xiàn),一般性能且有序的A53內(nèi)核,其加速成績比高性能且無序的A73內(nèi)核高,而A73的效率又高于A72,其原因可能是前者的解碼帶寬降低。
需要明確的是,由于NEON的多項功能并非全部滿負荷運行,這里的平均加速成績并不能完全代表其整體性能。對于當(dāng)前的NEON來說,其性能取決于核心和編譯器。盡管計算加權(quán)平均值可以在一定程度上從側(cè)面反映出大致性能水平,但每個視頻(編碼器、編碼器設(shè)置、內(nèi)容都不同)卻存在很大差異。
但一般來說,基于NEON匯編語言形成的大多數(shù)函數(shù),在性能優(yōu)化方面會比基于編譯器優(yōu)化的C語言所形成的函數(shù)快4到5倍,在某些特殊情況之下可能會超過20倍。
dav1d 0.3.1性能
我將會從以下圖表開始介紹:
測試此1080p視頻我們可以觀察到結(jié)果存在巨大差異:基于編譯器優(yōu)化的C語言(使用Clang)開發(fā)的dav1d,其在Apple A7與Snapdragon 835平臺甚至無法達到24 fps的幀率,而基于NEON開發(fā)的dav1d可以毫不費力地達到30 fps的流暢度,而Apple A10則從45 fps躍升至100 fps以上。如此性能提升對于移動設(shè)備來說意味著更低的功耗與更高效的資源利用。
如果將結(jié)果標(biāo)準(zhǔn)化,我們可以仔細查看確切的加速成果:
Snapdragon 835中的Cortex-A73所獲得的加速最為明顯,幾乎是基準(zhǔn)的3倍。其他核心平均值略低,為基準(zhǔn)的2.5倍。這意味著從基于優(yōu)化后的C語言開發(fā)的dav1d所實現(xiàn)的1倍性能提升到基于NEON開發(fā)的dav1d 0.1.0所實現(xiàn)的1.8倍性能提升,再到dav1d 0.3.1高達2.5倍的性能提升,NEON的優(yōu)化成果十分顯著。
展望未來
dav1d的Arm64開發(fā)還遠未完成,現(xiàn)在需要實現(xiàn)的最重要功能是提高移動端的NEON整合速度(同時推廣用于PC的AVX2和SSSE3),發(fā)展空間巨大。我們希望可實現(xiàn)比平均基準(zhǔn)三倍以上的性能優(yōu)化,同時更好的自動矢量化也可提供很多幫助,但主要的驅(qū)動程序仍然需要開發(fā)者的智慧和勤奮。
-
處理器
+關(guān)注
關(guān)注
68文章
19103瀏覽量
228825 -
ARM
+關(guān)注
關(guān)注
134文章
9028瀏覽量
366496 -
NEON技術(shù)
+關(guān)注
關(guān)注
1文章
9瀏覽量
6069
原文標(biāo)題:NEON技術(shù)如何實現(xiàn)移動端視頻高效解碼AV1?
文章出處:【微信號:livevideostack,微信公眾號:LiveVideoStack】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論