范明亮,郭子涵,柴曉楠,商建東
(1.鄭州大學(xué) 信息工程學(xué)院,鄭州 450001;2.國(guó)家超級(jí)計(jì)算鄭州中心,鄭州 450001)
隨著大規(guī)模集成電路和信息技術(shù)的發(fā)展,數(shù)字信號(hào)處理器(Digital Signal Processor,DSP)受到廣泛關(guān)注,DSP 具有高性能、低功耗等特點(diǎn),可以滿足圖像處理實(shí)時(shí)性以及密集型計(jì)算的需求,因此,在圖像處理領(lǐng)域得到大范圍應(yīng)用。目前,使用較多的高性能DSP 主要有TI 的C66X 系列,其片上集成8 個(gè)DSP 核心,單核浮點(diǎn)運(yùn)算能力可達(dá)20 GFlops[1-2]。近年來(lái),我國(guó)高性能DSP 的相關(guān)研究也取得了一定的成果,其中,由國(guó)防科技大學(xué)獨(dú)立研制的FT-M7002性能較為突出。FT 處理器片上集成2 個(gè)DSP 核心和1 個(gè)CPU 核心,浮點(diǎn)運(yùn)算能力達(dá)200 GFlops[3-4]。但是,在目前硬件發(fā)展較快的同時(shí)也顯現(xiàn)出國(guó)產(chǎn)DSP平臺(tái)缺乏相應(yīng)軟件支撐的問(wèn)題。因此,對(duì)國(guó)產(chǎn)高性能DSP 處理器相應(yīng)的軟件環(huán)境以及函數(shù)庫(kù)進(jìn)行適配與調(diào)優(yōu),充分發(fā)揮國(guó)產(chǎn)DSP 的特殊硬件架構(gòu)優(yōu)勢(shì)具有重大意義。
邊緣檢測(cè)是圖像處理和計(jì)算機(jī)視覺(jué)中的重要研究課題,其目的是識(shí)別出圖像中那些亮度發(fā)生明顯變化的點(diǎn)。目前,圖像邊緣檢測(cè)[5]廣泛應(yīng)用于圖像識(shí)別、醫(yī)學(xué)影像處理、機(jī)器學(xué)習(xí)等[6-8]領(lǐng)域。傳統(tǒng)邊緣檢測(cè)算子包括Roberts 算子、Sobel 算子、Canny 算子、Prewitt 算子等[9]。Sobel 算子因其耗時(shí)短、具有一定的抗噪性、邊緣檢測(cè)效果好而得到廣泛應(yīng)用。近年來(lái),很多學(xué)者基于硬件特性對(duì)Sobel 算法進(jìn)行改進(jìn),并取得了一定的成果。文獻(xiàn)[10]基于FPGA 提出一種多核矩陣處理器,其采用同構(gòu)多核結(jié)構(gòu)使數(shù)據(jù)并行傳輸和運(yùn)算。文獻(xiàn)[11]基于CUDA 架構(gòu),根據(jù)GPU 的并行結(jié)構(gòu)和硬件特點(diǎn)優(yōu)化數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)。文獻(xiàn)[12]基于Zynq-7000 系列平臺(tái),將ARM 處理器與FPGA 組合起來(lái)并利用異構(gòu)多核平臺(tái)實(shí)現(xiàn)加速。但是,由于各平臺(tái)體系結(jié)構(gòu)存在差異性,導(dǎo)致上述優(yōu)化算法并不適用于FT 系列的高性能DSP。
本文面向FT-M7002 高性能處理器,基于該平臺(tái)特性對(duì)Sobel 邊緣檢測(cè)算法進(jìn)行優(yōu)化。具體地,分析Sobel 算法特性,判斷其是否可以充分利用FT 平臺(tái)架構(gòu)進(jìn)行優(yōu)化,針對(duì)算法中密集型數(shù)據(jù)訪存運(yùn)算,使用向量化、循環(huán)展開(kāi)等優(yōu)化手段實(shí)現(xiàn)數(shù)據(jù)級(jí)并行性,以提高向量寄存器、向量運(yùn)算部件等硬件的資源利用率。在此基礎(chǔ)上,針對(duì)DMA 產(chǎn)生的數(shù)據(jù)傳輸開(kāi)銷(xiāo),采用雙緩沖區(qū)結(jié)構(gòu)使得數(shù)據(jù)傳輸與數(shù)據(jù)計(jì)算實(shí)現(xiàn)并行,并設(shè)計(jì)對(duì)比實(shí)驗(yàn)來(lái)測(cè)試優(yōu)化算法的正確性及檢測(cè)性能。
圖像邊緣即圖像中灰度值變化劇烈的位置,梯度算子就是利用圖像邊緣灰度的突變來(lái)檢測(cè)邊緣[13]。Sobel 算子包含2 個(gè)3×3 的矩陣,分別對(duì)水平和垂直方向上的像素進(jìn)行滑動(dòng)檢測(cè)。假設(shè)一副圖像中的某個(gè)3×3 區(qū)域如圖1 所示,則Sobel 算子水平和垂直梯度模板分別如圖2(a)、圖2(b)所示。
圖1 3×3 區(qū)域示意圖Fig.1 3×3 area schematic diagram
圖2 Sobel 算子的水平和垂直梯度模板Fig.2 Horizontal and vertical gradient templates of Sobel operator
2 個(gè)二維梯度模板可以拆分為2 個(gè)一維卷積核,分別如下:
以X方向卷積模板為例,其中,[-1 0 1]卷積計(jì)算模板是為了計(jì)算X方向的差分,也就是得到可能的邊緣點(diǎn),而則用來(lái)平滑差分處理之后的像素,Y方向的橫向和縱向卷積模板與X相同。根據(jù)上述2 個(gè)梯度模板,分別將其與圖像像素做卷積計(jì)算,公式如下:
由式(1)、式(2)可以得到該點(diǎn)橫向和縱向的亮度差分近似值,從而檢測(cè)出橫向和縱向的邊緣。梯度向量的幅值和方向分別如下:
根據(jù)式(3)可以得到該像素梯度的近似值,最后選取合適的閾值,將計(jì)算得到的梯度近似值與閾值進(jìn)行比較[14],若梯度近似值大于閾值,則該點(diǎn)為圖像的邊緣點(diǎn);否則,該點(diǎn)不是圖像的邊緣點(diǎn)[15-17]。由于Sobel算子對(duì)像素的位置影響做了加權(quán),可以降低邊緣模糊程度,因此其檢測(cè)效果優(yōu)于傳統(tǒng)的Prewitt算子、Roberts算子。
FT-M7002 高性能DSP 芯片使用三級(jí)存儲(chǔ)結(jié)構(gòu),單個(gè)計(jì)算核擁有32 KB 的一級(jí)數(shù)據(jù)緩存以及512 KB的向量存儲(chǔ)空間(AM),所有計(jì)算核共享2 MB 的全局共享Cache,核外擁有32 GB 的大容量DDR 存儲(chǔ)空間[18-21]。FT-MT2 內(nèi)核基于超長(zhǎng)指令字(VLIW)結(jié)構(gòu),包含一個(gè)五流出標(biāo)量處理單元(SPU)以及六流出向量處理單元(VPU),2 個(gè)處理單元以緊耦合方式工作[22]。SPU 用于支持標(biāo)量定點(diǎn)和浮點(diǎn)運(yùn)算,主要負(fù)責(zé)數(shù)據(jù)的串行處理工作。VPU 內(nèi)有16 個(gè)同構(gòu)運(yùn)算簇(VPE),負(fù)責(zé)對(duì)運(yùn)算量大的密集型數(shù)據(jù)進(jìn)行并行計(jì)算。直接存儲(chǔ)訪問(wèn)(DMA)部件為內(nèi)核提供了高速數(shù)據(jù)傳輸通路,通過(guò)配置傳輸參數(shù)啟動(dòng)對(duì)特定存儲(chǔ)資源的訪問(wèn),DMA 部件能夠?qū)崿F(xiàn)標(biāo)量存儲(chǔ)空間、向量存儲(chǔ)空間與核外DDR 空間之間的數(shù)據(jù)交互。FT-MT2 內(nèi)核結(jié)構(gòu)如圖3 所示。
圖3 FT-MT2 內(nèi)核結(jié)構(gòu)Fig.3 FT-MT2 kernel structure
VPE 內(nèi)部集成的4 個(gè)運(yùn)算部件可以支持標(biāo)量定點(diǎn)和浮點(diǎn)運(yùn)算,即該向量運(yùn)算單元最多可以同時(shí)對(duì)16 路32 位數(shù)據(jù)進(jìn)行向量運(yùn)算并且支持混洗/歸約操作。FT-M7002 特殊的體系結(jié)構(gòu)為大寬度的向量運(yùn)算提供了高效的數(shù)據(jù)存儲(chǔ)及傳輸支持,能夠在圖像處理這種密集重復(fù)型計(jì)算中發(fā)揮優(yōu)勢(shì)。
OpenCV 中通過(guò)獲取Sobel邊緣檢測(cè)所需的卷積核進(jìn)行梯度計(jì)算。Sobel 的實(shí)現(xiàn)是通過(guò)分離行卷積和列卷積來(lái)進(jìn)行梯度計(jì)算,分別從X方向和Y方向?qū)D片進(jìn)行卷積操作,每個(gè)卷積方向又再次劃分了橫向卷積與縱向卷積,具體實(shí)現(xiàn)流程如圖4 所示。在進(jìn)行X方向卷積計(jì)算時(shí),先將圖像像素點(diǎn)與橫向一維卷積模板相乘,然后再將計(jì)算之后的卷積結(jié)果與縱向一維卷積模板相乘,Y方向與之相同。使用分離的行、列卷積,能夠在很大程度上減少計(jì)算量,同時(shí)又促進(jìn)了對(duì)內(nèi)存的連續(xù)訪問(wèn)。但是,當(dāng)處理較大的圖片時(shí),內(nèi)存訪問(wèn)量仍然是影響該算法性能的主要因素。
圖4 Sobel 算法實(shí)現(xiàn)流程Fig.4 Sobel algorithm implementation procedure
Sobel 邊緣檢測(cè)的主要計(jì)算過(guò)程是X方向卷積與Y方向卷積,本文先對(duì)其核心計(jì)算進(jìn)行熱點(diǎn)分析,發(fā)現(xiàn)該部分約占整體運(yùn)行時(shí)間的1/2。因此,本文主要針對(duì)該核心計(jì)算部分使用SIMD 使其并行計(jì)算,充分利用FT 內(nèi)核中的向量寄存器資源,減少卷積計(jì)算部分?jǐn)?shù)據(jù)運(yùn)算的訪存次數(shù),此外,利用DMA 傳輸機(jī)制設(shè)置雙緩沖結(jié)構(gòu)使數(shù)據(jù)運(yùn)算與傳輸并行,最大程度地提高算法并行性,并通過(guò)FT 內(nèi)部指令封裝數(shù)據(jù)類(lèi)型轉(zhuǎn)換接口,從而擴(kuò)展平臺(tái)的兼容性。
2.2.1 向量并行優(yōu)化
根據(jù)Sobel 核心計(jì)算部分的特性可知,計(jì)算過(guò)程存在數(shù)據(jù)連續(xù)訪問(wèn)、迭代次數(shù)多、計(jì)算量大等特點(diǎn),而FT 處理器的內(nèi)核向量計(jì)算特性可以很好地支持其使用SIMD 并行化。
核心計(jì)算位于循環(huán)體內(nèi),因此,首先針對(duì)循環(huán)體進(jìn)行循環(huán)展開(kāi),選擇適當(dāng)?shù)恼归_(kāi)因子以保證代碼體積不會(huì)過(guò)大,同時(shí)提高軟件流水并行性,再利用FT內(nèi)嵌的向量指令對(duì)計(jì)算過(guò)程進(jìn)行向量化改寫(xiě)。首先,使用數(shù)據(jù)傳輸指令M7002_datatrans_cv 將內(nèi)存中的圖片數(shù)據(jù)傳輸?shù)较蛄康刂房臻g,通過(guò)vec_svbcast將這些數(shù)據(jù)從標(biāo)量空間廣播到向量空間;然后,利用vec_ld 指令從向量空間連續(xù)取出16 個(gè)數(shù)據(jù),使用vec_add、vec_muli 每次可以完成16 個(gè)輸入數(shù)據(jù)的乘加操作,計(jì)算完成后將結(jié)果保存到向量空間;最后,將結(jié)果傳輸回向量地址空間。以3×3 核的行卷積為例,具體核心計(jì)算部分代碼如下:
2.2.2 DMA 傳輸優(yōu)化
在Sobel 進(jìn)行卷積的實(shí)際操作中,輸入圖片對(duì)應(yīng)的矩陣規(guī)模一般大于向量存儲(chǔ)空間,因此,輸入數(shù)據(jù)需暫時(shí)置于核外DDR 中,通過(guò)DMA 將DDR 內(nèi)的數(shù)據(jù)傳輸?shù)紸M 中。
作為數(shù)據(jù)傳輸?shù)摹爸修D(zhuǎn)站”,DMA 的傳輸時(shí)間會(huì)影響整個(gè)算法的效率。為了提高傳輸速度,本文針對(duì)Sobel行卷積操作中的數(shù)據(jù)連續(xù)訪存過(guò)程,采用雙緩沖區(qū)傳輸結(jié)構(gòu),如圖5 所示,將AM 空間分成AM0 和AM1 兩部分?;诖四J剑瑪?shù)據(jù)從核外DDR 中傳入AM0 空間,在判斷為有效數(shù)據(jù)之后開(kāi)始計(jì)算,同時(shí),DMA 將下一塊數(shù)據(jù)傳給AM1。當(dāng)AM1中的數(shù)據(jù)開(kāi)始計(jì)算時(shí),AM0輸出上一次的計(jì)算結(jié)果并啟動(dòng)新數(shù)據(jù)傳輸,即在DMA進(jìn)行傳輸循環(huán)檢測(cè)前將數(shù)據(jù)的運(yùn)算與傳輸并行化,減少一部分運(yùn)算時(shí)間,從而達(dá)到性能優(yōu)化的目的。
圖5 雙緩沖機(jī)制示意圖Fig.5 Schematic diagram of double buffer mechanism
與行卷積數(shù)據(jù)傳輸過(guò)程不同的是,列卷積存在不連續(xù)的數(shù)據(jù)訪問(wèn),無(wú)法通過(guò)向量指令進(jìn)行連續(xù)存取。本文通過(guò)設(shè)置DMA 的目的索引值作為矩陣每行首元素的地址差,將行卷積矩陣中的每一行按列存儲(chǔ)在矩陣中,最終實(shí)現(xiàn)矩陣轉(zhuǎn)置。
2.2.3 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
在圖像處理庫(kù)中,默認(rèn)圖片矩陣類(lèi)型為8u(unsigned char),但是FT 向量處理器沒(méi)有直接處理8u 類(lèi)型的指令,針對(duì)該問(wèn)題,本文利用VPE 內(nèi)部混洗/規(guī)約等部件實(shí)現(xiàn)數(shù)據(jù)類(lèi)型轉(zhuǎn)換并封裝成接口,從而實(shí)現(xiàn)unsigned char 和unsigned int 之間的相互轉(zhuǎn)換,擴(kuò)充FT 平臺(tái)所支持?jǐn)?shù)據(jù)的類(lèi)型。
FT-M7002 向量寄存器可一次加載512 位數(shù)據(jù)到向量寄存器中。由于每個(gè)VPU 包含16 個(gè)VPE,因此每個(gè)VPE 中存放4 個(gè)unsigned char 類(lèi)型數(shù)據(jù),要轉(zhuǎn)換成unsigned int 類(lèi)型,即將每個(gè)VPE 中的4 個(gè)數(shù)據(jù)分別放入4 個(gè)VPE 中。如圖6 所示,將每個(gè)原始VPE中的數(shù)據(jù)與0XFF 按位相與,即可得到新的VPE 中的數(shù)據(jù)存放,連續(xù)操作3 次就可實(shí)現(xiàn)數(shù)據(jù)轉(zhuǎn)換。
圖6 char to int 類(lèi)型轉(zhuǎn)換(VPE0 實(shí)現(xiàn))Fig.6 char to int type conversion(implementation of VPE0)
圖6 只展示了VPE0 的實(shí)現(xiàn),可以對(duì)VPU 中的VPE0~VPE15 分別做上述操作。值得注意的是,上述操作得到的數(shù)據(jù)并不是按序存放的,因此,需要對(duì)這些數(shù)據(jù)進(jìn)行一次混洗(shuffle)操作,從而得到正確的數(shù)據(jù)排列方式。混洗單元通過(guò)合理配置混洗模式,可以實(shí)現(xiàn)VPE 中輸入數(shù)據(jù)的按序存放。
本文以3×3、5×5、7×7 卷積核為例,分析不同尺寸輸入圖片對(duì)算法加速比的影響,同時(shí)將本文優(yōu)化算法與TMS320C6678 中的Sobel 算法進(jìn)行性能對(duì)比,以分析2 類(lèi)處理器的單核計(jì)算能力。
在飛騰平臺(tái)的FT-M7002 開(kāi)發(fā)板上實(shí)現(xiàn)Sobel 算法優(yōu)化,調(diào)用定時(shí)器的計(jì)時(shí)函數(shù)來(lái)測(cè)試優(yōu)化后程序段的執(zhí)行時(shí)間,將FT-M7002 與TI 平臺(tái)的高性能數(shù)字信號(hào)處理器TMS320C6678 進(jìn)行對(duì)比分析。實(shí)驗(yàn)參數(shù)設(shè)置如表1 所示。
表1 實(shí)驗(yàn)平臺(tái)參數(shù)設(shè)置Table 1 Experimental platform parameters setting
Sobel 邊緣檢測(cè)算法能在FT 平臺(tái)上正確運(yùn)行是算法優(yōu)化的基礎(chǔ)。為了驗(yàn)證優(yōu)化算法的正確性,將不同尺寸大小的圖片輸入優(yōu)化算法并運(yùn)行于FT 平臺(tái),將其結(jié)果矩陣與OpenCV 圖像庫(kù)中Sobel 算法的結(jié)果矩陣進(jìn)行對(duì)比,將2 個(gè)結(jié)果圖片矩陣按像素點(diǎn)相減取絕對(duì)值,小于浮點(diǎn)數(shù)后6 位則認(rèn)為結(jié)果正確。經(jīng)驗(yàn)證,本文優(yōu)化算法均能得到正確的處理結(jié)果。
以Sobel 卷積核3×3、5×5、7×7 為例,分別以不同數(shù)據(jù)類(lèi)型及尺寸的輸入圖片運(yùn)行Sobel 串行算法和優(yōu)化算法,在FT-M7002 處理器上的運(yùn)行結(jié)果(時(shí)鐘周期)如表2、表3 所示。從中可以看出,對(duì)于不同數(shù)據(jù)類(lèi)型的輸入矩陣,本文優(yōu)化算法可取得1.66~3.14 倍的加速效果。加速效果整體趨勢(shì)如圖7、圖8 所示,其中,橫坐標(biāo)表示輸入矩陣規(guī)模,縱坐標(biāo)表示本文優(yōu)化算法相較串行算法所取得的加速比。
表2 8u 類(lèi)型優(yōu)化前后的性能比較Table 2 Performance comparison before and after 8u type optimization
圖8 32f 類(lèi)型Sobel 優(yōu)化算法相較串行算法的加速比Fig.8 The speedup ratio of 32f type Sobel optimization algorithm compared with serial algorithm
3.3.1 unsigned char 類(lèi)型測(cè)試結(jié)果與分析
表2 所示為8u 類(lèi)型不同矩陣規(guī)模分別在卷積核為3×3、5×5、7×7 上運(yùn)行時(shí)的時(shí)鐘周期以及加速比,圖7 為其對(duì)應(yīng)的加速效果柱狀圖??梢钥闯?,整體加速比為1.75 左右,從趨勢(shì)上來(lái)看,在同一輸入矩陣規(guī)模下,隨著卷積核的增大,計(jì)算量也在增大,加速比也增大;在卷積核一定的情況下,加速比隨著矩陣規(guī)模的增大而緩慢增大,最后趨于平穩(wěn),這是因?yàn)閿?shù)據(jù)存放在DDR 中,隨著矩陣規(guī)模的增大,雖然使用了DMA 雙緩沖結(jié)構(gòu),但是傳輸仍然耗時(shí)從而使得加速效果不明顯,另外還需要進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換,輸入矩陣規(guī)模越大,類(lèi)型轉(zhuǎn)換也就越耗時(shí)。
3.3.2 float 類(lèi)型測(cè)試結(jié)果與分析
表3 所示為float類(lèi)型不同矩陣規(guī)模分別在卷積核為3×3、5×5、7×7 上運(yùn)行時(shí)的時(shí)鐘周期以及加速比,圖8為其對(duì)應(yīng)的加速效果柱狀圖。對(duì)比表2、表3可以看出,float類(lèi)型的整體加速效果明顯優(yōu)于unsigned char類(lèi)型,主要是因?yàn)镕T 向量處理器可以直接處理float 類(lèi)型的數(shù)據(jù),不需要進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換。對(duì)于不同的卷積核,核越大,加速效果越明顯,這是因?yàn)殡S著核的不斷增大,循環(huán)內(nèi)每次計(jì)算的數(shù)據(jù)規(guī)模也就越大,因此,優(yōu)化算法能更好地提升循環(huán)內(nèi)數(shù)據(jù)的并行性。
3.3.3 平臺(tái)對(duì)比分析
本次實(shí)驗(yàn)的對(duì)比測(cè)試所用圖片為unsigned char 類(lèi)型的三通道圖片。在TMS320C6678中運(yùn)行Sobel算法,在FT-M7002 中運(yùn)行本文優(yōu)化算法,分別使用TI 與FT平臺(tái)的計(jì)時(shí)函數(shù)記錄運(yùn)行時(shí)間,F(xiàn)T 時(shí)鐘周期換算為T(mén)I時(shí)鐘周期時(shí)需要乘16。測(cè)試結(jié)果如表4 所示,整體加速效果如圖9 所示。從中可以看出,對(duì)于不同大小的圖片矩陣,F(xiàn)T-M7002 向量處理器比TI6678 多核處理器快了1.87~2.08 倍。因此,對(duì)于單核密集型運(yùn)算,F(xiàn)T-M7002 平臺(tái)相較TI6678 平臺(tái)有一定的計(jì)算優(yōu)勢(shì)。
表4 FT 與TI 平臺(tái)的比較Table 4 Comparison between FT and TI platforms
圖9 FT-M7002 平臺(tái)較TI6678 平臺(tái)的加速比Fig.9 The speedup ratio of FT-M7002 platform compared with TI6678 platform
本文分析FT-M7002 硬件平臺(tái)架構(gòu)和Sobel邊緣檢測(cè)算法,基于FT內(nèi)核結(jié)構(gòu)特點(diǎn)對(duì)Sobel算法進(jìn)行優(yōu)化。為了充分發(fā)揮FT-M7002 平臺(tái)的高性能計(jì)算特性,使用FT 內(nèi)嵌指令對(duì)算法進(jìn)行向量并行優(yōu)化,利用循環(huán)展開(kāi)的優(yōu)化手段充分發(fā)掘數(shù)據(jù)級(jí)并行性。設(shè)計(jì)DMA 雙緩沖區(qū)傳輸結(jié)構(gòu)同步數(shù)據(jù)的傳輸與運(yùn)算,對(duì)列卷積進(jìn)行矩陣轉(zhuǎn)置以解決其不能連續(xù)訪存的不足。針對(duì)FT 平臺(tái)向量部件不支持unsigned char類(lèi)型訪存操作的問(wèn)題,設(shè)計(jì)相應(yīng)的數(shù)據(jù)轉(zhuǎn)換接口。對(duì)多種輸入圖片矩陣規(guī)模和卷積核大小進(jìn)行對(duì)比測(cè)試,結(jié)果表明,在保證正確性的基礎(chǔ)上,該優(yōu)化算法相較串行算法獲得了1.66~3.14倍的加速比,相較TMS320C6678處理器也取得了1.87~2.08 倍的加速效果,充分驗(yàn)證了本文所使用優(yōu)化方法的有效性以及FT-M7002 平臺(tái)的高性能計(jì)算優(yōu)勢(shì)。但是,本文目前僅針對(duì)單核進(jìn)行了優(yōu)化研究,下一步將探索多核優(yōu)化問(wèn)題,并在FT-M7002 平臺(tái)上實(shí)現(xiàn)OpenCV圖像算法庫(kù)的整體優(yōu)化。