基於SIMD的算法加速技術簡介


在手機應用越來越多,機身越來越輕薄的今天。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 內核黑科技 | 技術文章 | 精選教程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM