在手機應用越來越多,機身越來越輕薄的今天。CPU卡頓問題、手機發熱問題和待機續航問題越來越多。限頻、降幀,這些常用的手段會降低用戶的體驗,並不是根本的解決之策。我們迫切需要一個低功耗高性能的秘密武器,來解決遇到的上述問題。DSP作為手機中已配置的資源,其擁有強大的計算能力和更低的功耗,在相機視頻、游戲這類高負載的應用場景,如果能充分利用,可以很好的降低CPU的負載,減少發熱和卡頓。
本文主要基於高通Hexagon DSP平台,介紹SIMD加速技技術。可以為手機功耗問題提供一些切實可行的解決方案。
一、背景介紹
SIMD 全稱Single Instruction Multiple Data,單指令多數據流。是一種采用一個控制器來控制多個處理器,同時對一組數據(又稱“數據向量”)中的每一個分別執行相同的操作從而實現空間上的並行性的技術。在圖像處理過程中,由於圖像的數據常用的數據類型是RGB565, RGBA8888, YUV422等格式,這些格式的數據特點是一個像素點的一個分量總是用小於等於8bit的數據表示的。如果使用傳統的處理器做計算,雖然處理器的寄存器是32位或是64位的,處理這些數據卻只能用於他們的低8位,效率太低。如果把64位寄存器拆成8個8位寄存器就能同時完成8個操作,計算效率提升了8倍。這就是SIMD指令的核心思想。隨着后來的發展慢慢cover的功能越來越多。
DSP(digital signal processor)是一種獨特的微處理器,是以數字信號來處理大量信息的器件。是高通或者MTK的SoC套片中為數據處理做過優化的專用處理器單元。一向以低功耗,高性能著稱。高通通過引入HVX,也就是Hexagon Vector eXtensions(Hexagon矢量擴展引擎)來加強處理器的矢量計算能力。其高效、強大的處理能力正是基於SIMD技術,可以並行處理1024bit的數據,在視頻處理、AI等對需要處理大量數據的領域有着CPU無法比擬的優勢。相比強大的CPU,DSP尤其擅長在低功耗下處理這些任務。隨着手機使用需求的不斷擴大,電池容量卻很難提高,如果能利用好DSP低功耗的特點,可以很好的解決一些遇到的發熱、卡頓等性能問題。
高通Hexagon DSP以獨特的體系架構領先一步,下面以高通Hexagon V66 DSP來做簡單介紹。
二、cDSP 運算部件的特點
結構特點:
DSP中包含cDSP(Compute DSP)、aDSP(Application/Audio DSP)、mDsp(Modem DSP)、lDSP(Low power DSP)等多個組成單元。其中cDSP是DSP中的核心計算單元,在SoC的架構中與CPU處於同等地位,其也可以訪問系統總線,訪問DDR等。
cDSP主要部件包含:
標量處理器:Scalar Processor(Hexagon),一般用於邏輯控制,支持整型和浮點型數據運算。
矢量處理器:Vector Processor(HVX/Hexagon Vector Extension),處理向量運行;
二級緩存:L2 cache,可用於復雜場景的內存加速。
圖1 cDSP架構圖
Hexagon處理器中包含常見的處理單元XU(Execution Unit)、$(Cache)、RF(Register File)、MMU(Memory Management Unit)等。每個硬件線程均包含32個向量寄存器,4個predicate寄存器。每個向量寄存器寬度為1024bit,可以以word、halfword或byte三種方式進行運算。每個predicate寄存器包含128bit。兩個向量寄存器(vector)可以組成一個寄存器組(vectorPair)。
三、指令介紹
通過在idl文件中定義供上層調用的接口,會編譯生成一個后綴名為skel的so文件,里面接口用DSP實現。通過FastRPC接口實現Applications PRocessor對DSP Processor底層實現的調用。
HVX 提供了如查表(vlut/vscatter/vgather)、移位(vror/vasl/vasr/vlsr)、拼接(valign/vlalign)等多種指令,可以組合實現各種功能。
1、拼接 (valign/vlalign)
valign/vlalign:去掉右邊/左邊寄存器的Rt個字節,將剩下的拼接在一起
2、移位 (vror/vasl/vasr/vlsr)
vror:循環右移,將一個vector首位當做一個環,右移Rt個字節。
vasl/vasr/vlsr:邏輯移位
vasr/vlsr 都是右移,區別在於是有符號位和無符號數
可以用在乘除運算,圖像10bit --> 8bit的位數轉換等場景。
3、拆分 (vshuffe/vshuffo/vshuffoe/vdeal/vshuff)
vshuffe/vshuffo:將even/odd位挑出來放一起
vshuffe/vshuffo:同時執行兩個操作,分開放置
vdeal 奇數/偶數收集起來分兩個部分放置
vshuff 跟vdeal 操作相反,將高低兩個部分分散到奇/偶位
4、打包 (vpacke/vpacko/vpack)
vpacke/vpacko:可以收集兩個vector 中的奇數位/偶數位
vpack:給兩個vector 壓縮到一個vector,從half word --> byte
5、查表 (vlut/vscatter/vgather)
vlut:可以查256字節的小表
vscatter/vgather 可以查64kb大小的表
四、算法優化示例
例1、對一個輸入矩陣取絕對值
C++ 一般實現方法:
HVX 實現方法:
通過上面的對比可以看出,HVX 並行處理可以大大減少循環次數,只有原來的128分之一,顯著提高運算效率。其中的Q6_Vh_abs_Vh()這個函數是HVX封裝的intrinsic 接口。可以通過查詢HVX programming guide 文檔選擇合適的指令。
例2、使用L2 Cache加速
對例1,使用L2 Cache加速
使用L2 Cache 提前將fetch需要訪問的數據,能使內存讀取的速度提高一倍以上。
需要注意幾點:
1)需要提前prefetche
2)三條以上的fetch指令,如果前面的fetch指令沒有執行完會被后面的沖掉
3)fetch的內容讀取比較快,寫入有時會很慢,可能有cache miss
4)通常fetch 8kb在以下,多發出幾個fetch指令效果會比較好
L2 Catch 的使用可以參考HVX編程指南文檔。
例3、多線程優化
HVX支持多線程,開啟多線程需要四個步驟:
1)prepare&check
2)prepare data and callbackFuntion
3)submit job
4)synctoken job token 同步令牌
通過合理的分配任務,開啟多線程可以將大幅減少算法的運行時間。
五、總結
SIMD技術,是一種“數據並行”的加速方案,在處理向量計算的情況下,同一個向量的不同維度之間的計算是相互獨立的。與CPU或GPU相比,DSP有着低功耗,高性能的特點,在大數據量處理方面還是有着很大的優勢,並且在如人工智能、視頻處理等領域有着廣闊的應用前景。合理的利用DSP的並行計算能力,可以很好的從CPU上offload一部分負載,從而減少CPU卡頓和手機發熱的問題。
參考文獻:
https://zhuanlan.zhihu.com/p/31271788
https://new.qq.com/omn/20180527/20180527A099CU.html
https://developer.qualcomm.com/software/hexagon-dsp-sdk/dsp-processor

“內核工匠”微信公眾號
Linux 內核黑科技 | 技術文章 | 精選教程