范明亮,郭子涵,柴曉楠,商建東
(1.鄭州大學 信息工程學院,鄭州 450001;2.國家超級計算鄭州中心,鄭州 450001)
隨著大規模集成電路和信息技術的發展,數字信號處理器(Digital Signal Processor,DSP)受到廣泛關注,DSP 具有高性能、低功耗等特點,可以滿足圖像處理實時性以及密集型計算的需求,因此,在圖像處理領域得到大范圍應用。目前,使用較多的高性能DSP 主要有TI 的C66X 系列,其片上集成8 個DSP 核心,單核浮點運算能力可達20 GFlops[1-2]。近年來,我國高性能DSP 的相關研究也取得了一定的成果,其中,由國防科技大學獨立研制的FT-M7002性能較為突出。FT 處理器片上集成2 個DSP 核心和1 個CPU 核心,浮點運算能力達200 GFlops[3-4]。但是,在目前硬件發展較快的同時也顯現出國產DSP平臺缺乏相應軟件支撐的問題。因此,對國產高性能DSP 處理器相應的軟件環境以及函數庫進行適配與調優,充分發揮國產DSP 的特殊硬件架構優勢具有重大意義。
邊緣檢測是圖像處理和計算機視覺中的重要研究課題,其目的是識別出圖像中那些亮度發生明顯變化的點。目前,圖像邊緣檢測[5]廣泛應用于圖像識別、醫學影像處理、機器學習等[6-8]領域。傳統邊緣檢測算子包括Roberts 算子、Sobel 算子、Canny 算子、Prewitt 算子等[9]。Sobel 算子因其耗時短、具有一定的抗噪性、邊緣檢測效果好而得到廣泛應用。近年來,很多學者基于硬件特性對Sobel 算法進行改進,并取得了一定的成果。文獻[10]基于FPGA 提出一種多核矩陣處理器,其采用同構多核結構使數據并行傳輸和運算。文獻[11]基于CUDA 架構,根據GPU 的并行結構和硬件特點優化數據存儲結構。文獻[12]基于Zynq-7000 系列平臺,將ARM 處理器與FPGA 組合起來并利用異構多核平臺實現加速。但是,由于各平臺體系結構存在差異性,導致上述優化算法并不適用于FT 系列的高性能DSP。
本文面向FT-M7002 高性能處理器,基于該平臺特性對Sobel 邊緣檢測算法進行優化。具體地,分析Sobel 算法特性,判斷其是否可以充分利用FT 平臺架構進行優化,針對算法中密集型數據訪存運算,使用向量化、循環展開等優化手段實現數據級并行性,以提高向量寄存器、向量運算部件等硬件的資源利用率。在此基礎上,針對DMA 產生的數據傳輸開銷,采用雙緩沖區結構使得數據傳輸與數據計算實現并行,并設計對比實驗來測試優化算法的正確性及檢測性能。
圖像邊緣即圖像中灰度值變化劇烈的位置,梯度算子就是利用圖像邊緣灰度的突變來檢測邊緣[13]。Sobel 算子包含2 個3×3 的矩陣,分別對水平和垂直方向上的像素進行滑動檢測。假設一副圖像中的某個3×3 區域如圖1 所示,則Sobel 算子水平和垂直梯度模板分別如圖2(a)、圖2(b)所示。

圖1 3×3 區域示意圖Fig.1 3×3 area schematic diagram

圖2 Sobel 算子的水平和垂直梯度模板Fig.2 Horizontal and vertical gradient templates of Sobel operator
2 個二維梯度模板可以拆分為2 個一維卷積核,分別如下:
以X方向卷積模板為例,其中,[-1 0 1]卷積計算模板是為了計算X方向的差分,也就是得到可能的邊緣點,而則用來平滑差分處理之后的像素,Y方向的橫向和縱向卷積模板與X相同。根據上述2 個梯度模板,分別將其與圖像像素做卷積計算,公式如下:

由式(1)、式(2)可以得到該點橫向和縱向的亮度差分近似值,從而檢測出橫向和縱向的邊緣。梯度向量的幅值和方向分別如下:

根據式(3)可以得到該像素梯度的近似值,最后選取合適的閾值,將計算得到的梯度近似值與閾值進行比較[14],若梯度近似值大于閾值,則該點為圖像的邊緣點;否則,該點不是圖像的邊緣點[15-17]。由于Sobel算子對像素的位置影響做了加權,可以降低邊緣模糊程度,因此其檢測效果優于傳統的Prewitt算子、Roberts算子。
FT-M7002 高性能DSP 芯片使用三級存儲結構,單個計算核擁有32 KB 的一級數據緩存以及512 KB的向量存儲空間(AM),所有計算核共享2 MB 的全局共享Cache,核外擁有32 GB 的大容量DDR 存儲空間[18-21]。FT-MT2 內核基于超長指令字(VLIW)結構,包含一個五流出標量處理單元(SPU)以及六流出向量處理單元(VPU),2 個處理單元以緊耦合方式工作[22]。SPU 用于支持標量定點和浮點運算,主要負責數據的串行處理工作。VPU 內有16 個同構運算簇(VPE),負責對運算量大的密集型數據進行并行計算。直接存儲訪問(DMA)部件為內核提供了高速數據傳輸通路,通過配置傳輸參數啟動對特定存儲資源的訪問,DMA 部件能夠實現標量存儲空間、向量存儲空間與核外DDR 空間之間的數據交互。FT-MT2 內核結構如圖3 所示。

圖3 FT-MT2 內核結構Fig.3 FT-MT2 kernel structure
VPE 內部集成的4 個運算部件可以支持標量定點和浮點運算,即該向量運算單元最多可以同時對16 路32 位數據進行向量運算并且支持混洗/歸約操作。FT-M7002 特殊的體系結構為大寬度的向量運算提供了高效的數據存儲及傳輸支持,能夠在圖像處理這種密集重復型計算中發揮優勢。
OpenCV 中通過獲取Sobel邊緣檢測所需的卷積核進行梯度計算。Sobel 的實現是通過分離行卷積和列卷積來進行梯度計算,分別從X方向和Y方向對圖片進行卷積操作,每個卷積方向又再次劃分了橫向卷積與縱向卷積,具體實現流程如圖4 所示。在進行X方向卷積計算時,先將圖像像素點與橫向一維卷積模板相乘,然后再將計算之后的卷積結果與縱向一維卷積模板相乘,Y方向與之相同。使用分離的行、列卷積,能夠在很大程度上減少計算量,同時又促進了對內存的連續訪問。但是,當處理較大的圖片時,內存訪問量仍然是影響該算法性能的主要因素。

圖4 Sobel 算法實現流程Fig.4 Sobel algorithm implementation procedure
Sobel 邊緣檢測的主要計算過程是X方向卷積與Y方向卷積,本文先對其核心計算進行熱點分析,發現該部分約占整體運行時間的1/2。因此,本文主要針對該核心計算部分使用SIMD 使其并行計算,充分利用FT 內核中的向量寄存器資源,減少卷積計算部分數據運算的訪存次數,此外,利用DMA 傳輸機制設置雙緩沖結構使數據運算與傳輸并行,最大程度地提高算法并行性,并通過FT 內部指令封裝數據類型轉換接口,從而擴展平臺的兼容性。
2.2.1 向量并行優化
根據Sobel 核心計算部分的特性可知,計算過程存在數據連續訪問、迭代次數多、計算量大等特點,而FT 處理器的內核向量計算特性可以很好地支持其使用SIMD 并行化。
核心計算位于循環體內,因此,首先針對循環體進行循環展開,選擇適當的展開因子以保證代碼體積不會過大,同時提高軟件流水并行性,再利用FT內嵌的向量指令對計算過程進行向量化改寫。首先,使用數據傳輸指令M7002_datatrans_cv 將內存中的圖片數據傳輸到向量地址空間,通過vec_svbcast將這些數據從標量空間廣播到向量空間;然后,利用vec_ld 指令從向量空間連續取出16 個數據,使用vec_add、vec_muli 每次可以完成16 個輸入數據的乘加操作,計算完成后將結果保存到向量空間;最后,將結果傳輸回向量地址空間。以3×3 核的行卷積為例,具體核心計算部分代碼如下:


2.2.2 DMA 傳輸優化
在Sobel 進行卷積的實際操作中,輸入圖片對應的矩陣規模一般大于向量存儲空間,因此,輸入數據需暫時置于核外DDR 中,通過DMA 將DDR 內的數據傳輸到AM 中。
作為數據傳輸的“中轉站”,DMA 的傳輸時間會影響整個算法的效率。為了提高傳輸速度,本文針對Sobel行卷積操作中的數據連續訪存過程,采用雙緩沖區傳輸結構,如圖5 所示,將AM 空間分成AM0 和AM1 兩部分。基于此模式,數據從核外DDR 中傳入AM0 空間,在判斷為有效數據之后開始計算,同時,DMA 將下一塊數據傳給AM1。當AM1中的數據開始計算時,AM0輸出上一次的計算結果并啟動新數據傳輸,即在DMA進行傳輸循環檢測前將數據的運算與傳輸并行化,減少一部分運算時間,從而達到性能優化的目的。

圖5 雙緩沖機制示意圖Fig.5 Schematic diagram of double buffer mechanism
與行卷積數據傳輸過程不同的是,列卷積存在不連續的數據訪問,無法通過向量指令進行連續存取。本文通過設置DMA 的目的索引值作為矩陣每行首元素的地址差,將行卷積矩陣中的每一行按列存儲在矩陣中,最終實現矩陣轉置。
2.2.3 數據類型轉換
在圖像處理庫中,默認圖片矩陣類型為8u(unsigned char),但是FT 向量處理器沒有直接處理8u 類型的指令,針對該問題,本文利用VPE 內部混洗/規約等部件實現數據類型轉換并封裝成接口,從而實現unsigned char 和unsigned int 之間的相互轉換,擴充FT 平臺所支持數據的類型。
FT-M7002 向量寄存器可一次加載512 位數據到向量寄存器中。由于每個VPU 包含16 個VPE,因此每個VPE 中存放4 個unsigned char 類型數據,要轉換成unsigned int 類型,即將每個VPE 中的4 個數據分別放入4 個VPE 中。如圖6 所示,將每個原始VPE中的數據與0XFF 按位相與,即可得到新的VPE 中的數據存放,連續操作3 次就可實現數據轉換。

圖6 char to int 類型轉換(VPE0 實現)Fig.6 char to int type conversion(implementation of VPE0)
圖6 只展示了VPE0 的實現,可以對VPU 中的VPE0~VPE15 分別做上述操作。值得注意的是,上述操作得到的數據并不是按序存放的,因此,需要對這些數據進行一次混洗(shuffle)操作,從而得到正確的數據排列方式?;煜磫卧ㄟ^合理配置混洗模式,可以實現VPE 中輸入數據的按序存放。
本文以3×3、5×5、7×7 卷積核為例,分析不同尺寸輸入圖片對算法加速比的影響,同時將本文優化算法與TMS320C6678 中的Sobel 算法進行性能對比,以分析2 類處理器的單核計算能力。
在飛騰平臺的FT-M7002 開發板上實現Sobel 算法優化,調用定時器的計時函數來測試優化后程序段的執行時間,將FT-M7002 與TI 平臺的高性能數字信號處理器TMS320C6678 進行對比分析。實驗參數設置如表1 所示。

表1 實驗平臺參數設置Table 1 Experimental platform parameters setting
Sobel 邊緣檢測算法能在FT 平臺上正確運行是算法優化的基礎。為了驗證優化算法的正確性,將不同尺寸大小的圖片輸入優化算法并運行于FT 平臺,將其結果矩陣與OpenCV 圖像庫中Sobel 算法的結果矩陣進行對比,將2 個結果圖片矩陣按像素點相減取絕對值,小于浮點數后6 位則認為結果正確。經驗證,本文優化算法均能得到正確的處理結果。
以Sobel 卷積核3×3、5×5、7×7 為例,分別以不同數據類型及尺寸的輸入圖片運行Sobel 串行算法和優化算法,在FT-M7002 處理器上的運行結果(時鐘周期)如表2、表3 所示。從中可以看出,對于不同數據類型的輸入矩陣,本文優化算法可取得1.66~3.14 倍的加速效果。加速效果整體趨勢如圖7、圖8 所示,其中,橫坐標表示輸入矩陣規模,縱坐標表示本文優化算法相較串行算法所取得的加速比。

表2 8u 類型優化前后的性能比較Table 2 Performance comparison before and after 8u type optimization

圖8 32f 類型Sobel 優化算法相較串行算法的加速比Fig.8 The speedup ratio of 32f type Sobel optimization algorithm compared with serial algorithm
3.3.1 unsigned char 類型測試結果與分析
表2 所示為8u 類型不同矩陣規模分別在卷積核為3×3、5×5、7×7 上運行時的時鐘周期以及加速比,圖7 為其對應的加速效果柱狀圖??梢钥闯?,整體加速比為1.75 左右,從趨勢上來看,在同一輸入矩陣規模下,隨著卷積核的增大,計算量也在增大,加速比也增大;在卷積核一定的情況下,加速比隨著矩陣規模的增大而緩慢增大,最后趨于平穩,這是因為數據存放在DDR 中,隨著矩陣規模的增大,雖然使用了DMA 雙緩沖結構,但是傳輸仍然耗時從而使得加速效果不明顯,另外還需要進行數據類型轉換,輸入矩陣規模越大,類型轉換也就越耗時。
3.3.2 float 類型測試結果與分析
表3 所示為float類型不同矩陣規模分別在卷積核為3×3、5×5、7×7 上運行時的時鐘周期以及加速比,圖8為其對應的加速效果柱狀圖。對比表2、表3可以看出,float類型的整體加速效果明顯優于unsigned char類型,主要是因為FT 向量處理器可以直接處理float 類型的數據,不需要進行數據類型轉換。對于不同的卷積核,核越大,加速效果越明顯,這是因為隨著核的不斷增大,循環內每次計算的數據規模也就越大,因此,優化算法能更好地提升循環內數據的并行性。
3.3.3 平臺對比分析
本次實驗的對比測試所用圖片為unsigned char 類型的三通道圖片。在TMS320C6678中運行Sobel算法,在FT-M7002 中運行本文優化算法,分別使用TI 與FT平臺的計時函數記錄運行時間,FT 時鐘周期換算為TI時鐘周期時需要乘16。測試結果如表4 所示,整體加速效果如圖9 所示。從中可以看出,對于不同大小的圖片矩陣,FT-M7002 向量處理器比TI6678 多核處理器快了1.87~2.08 倍。因此,對于單核密集型運算,FT-M7002 平臺相較TI6678 平臺有一定的計算優勢。

表4 FT 與TI 平臺的比較Table 4 Comparison between FT and TI platforms

圖9 FT-M7002 平臺較TI6678 平臺的加速比Fig.9 The speedup ratio of FT-M7002 platform compared with TI6678 platform
本文分析FT-M7002 硬件平臺架構和Sobel邊緣檢測算法,基于FT內核結構特點對Sobel算法進行優化。為了充分發揮FT-M7002 平臺的高性能計算特性,使用FT 內嵌指令對算法進行向量并行優化,利用循環展開的優化手段充分發掘數據級并行性。設計DMA 雙緩沖區傳輸結構同步數據的傳輸與運算,對列卷積進行矩陣轉置以解決其不能連續訪存的不足。針對FT 平臺向量部件不支持unsigned char類型訪存操作的問題,設計相應的數據轉換接口。對多種輸入圖片矩陣規模和卷積核大小進行對比測試,結果表明,在保證正確性的基礎上,該優化算法相較串行算法獲得了1.66~3.14倍的加速比,相較TMS320C6678處理器也取得了1.87~2.08 倍的加速效果,充分驗證了本文所使用優化方法的有效性以及FT-M7002 平臺的高性能計算優勢。但是,本文目前僅針對單核進行了優化研究,下一步將探索多核優化問題,并在FT-M7002 平臺上實現OpenCV圖像算法庫的整體優化。