陳 云,王夢(mèng)園,柴曉楠,商建東
(1.鄭州大學(xué)信息工程學(xué)院,河南 鄭州 450001;2.河南省超級(jí)計(jì)算中心(鄭州大學(xué)),河南 鄭州 450052)
DSP(Digital Signal Processor)起源于20世紀(jì)70年代,針對(duì)數(shù)字信號(hào)處理中存在的大量累加累乘運(yùn)算設(shè)置乘加器MAC(Multiplication Adder Cycle)部件,結(jié)構(gòu)比較簡(jiǎn)單。隨著社會(huì)的不斷進(jìn)步,DSP的應(yīng)用領(lǐng)域也變得更加廣泛,為滿(mǎn)足大型稠密線性方程組求解、雷達(dá)信號(hào)處理、高清視頻和數(shù)字圖像處理等計(jì)算密集型應(yīng)用的高性能計(jì)算需求,數(shù)字信號(hào)處理器的體系結(jié)構(gòu)出現(xiàn)顯著變化,出現(xiàn)了高性能數(shù)字信號(hào)處理器。目前應(yīng)用較多的高性能DSP體系結(jié)構(gòu)主要有片上多核以及核內(nèi)集成支持了單指令多數(shù)據(jù)SIMD(Single Instruction Multiple Data)、超長(zhǎng)指令字VLIW(Very Long Instruction Word)技術(shù)的部件, 比如TI的TMS320C6678處理器,片上集成8個(gè)DSP核心,單核浮點(diǎn)運(yùn)算能力可達(dá)20 GFlop/s[1,2]。近幾年我國(guó)高性能數(shù)字信號(hào)處理器的研究也取得了一定的成就,國(guó)防科技大學(xué)自主研發(fā)的飛騰FT(FeiTeng)系列多核處理器[3]、向量處理器相繼出現(xiàn)。但是,硬件的快速發(fā)展也會(huì)帶來(lái)一些問(wèn)題,如缺乏配套的軟件應(yīng)用,只有適配相應(yīng)的軟件應(yīng)用才能充分發(fā)揮高性能DSP的特殊硬件架構(gòu)優(yōu)勢(shì),實(shí)現(xiàn)國(guó)產(chǎn)數(shù)字信號(hào)處理器在圖像處理、雷達(dá)信號(hào)處理等領(lǐng)域的實(shí)時(shí)性與高效性。因此,基于快速發(fā)展的我國(guó)高性能數(shù)字信號(hào)處理器,開(kāi)發(fā)相應(yīng)的高性能軟件應(yīng)用是我們需要考慮并解決的問(wèn)題。
在圖像處理領(lǐng)域,一般待處理圖像中往往會(huì)存在一定程度的噪聲干擾,惡化了圖像的質(zhì)量。高斯平滑濾波作為圖像預(yù)處理的重要組成部分具有優(yōu)良的噪聲平滑性能和邊緣保留能力[4,5],是保證后續(xù)特征提取與識(shí)別正確進(jìn)行的基礎(chǔ)。現(xiàn)有的高斯濾波算法實(shí)現(xiàn)并不能充分利用FT平臺(tái)的計(jì)算性能,會(huì)影響到使用該算法的多種大型圖像處理應(yīng)用,因此面向FT系列處理器實(shí)現(xiàn)高效的高斯濾波算法具有重要的意義。
目前有很多學(xué)者針對(duì)硬件特性對(duì)高斯濾波算法進(jìn)行相應(yīng)的優(yōu)化,并取得了一定成果。文獻(xiàn)[6]針對(duì)TMS320C6x系列處理器提出了一種單次遍歷實(shí)現(xiàn)2次卷積的高斯平滑濾波DSP優(yōu)化方法;文獻(xiàn)[7]針對(duì)TMS320C6416處理器的內(nèi)部資源,提出了基于該處理器的空間低通濾波程序的設(shè)計(jì)方案;文獻(xiàn)[8]基于CPU的SSE指令集,完成了高斯濾波器的SIMD優(yōu)化遞歸IIR(Infinite Impulse Response)實(shí)現(xiàn),并在OpenMP(Open Multi- Processing)的幫助下實(shí)現(xiàn)了單指令多數(shù)據(jù)擴(kuò)展流SSE(Streaming SIMD Extensions)版本的并行化;文獻(xiàn)[9]總結(jié)了高斯濾波算法原理和CUDA(Compute Unified Device Architecture)并行計(jì)算體系,提出了適合于CUDA的并行高斯濾波算法。但是,由于不同處理器體系結(jié)構(gòu)的差異性,上述并行優(yōu)化算法并不適用于FT系列高性能數(shù)字信號(hào)處理平臺(tái)。
本文面向國(guó)防科技大學(xué)自主研發(fā)的FT-M7002高性能處理器的特殊硬件架構(gòu),設(shè)計(jì)高斯濾波并行算法。主要內(nèi)容包含以下幾個(gè)方面:(1)分析高斯濾波算法計(jì)算特點(diǎn)與FT-M7002體系結(jié)構(gòu);(2)分析高斯濾波算法加速瓶頸,設(shè)計(jì)相應(yīng)的優(yōu)化方案;(3)通過(guò)手工向量化、控制流消除和循環(huán)展開(kāi)等優(yōu)化手段充分利用數(shù)據(jù)級(jí)與指令級(jí)并行性;(4)針對(duì)FT-MT2內(nèi)核中的DMA(Direct Memory Access)硬件和向量存儲(chǔ)器結(jié)構(gòu)特點(diǎn),進(jìn)行了“乒-乓”緩存、DMA數(shù)組轉(zhuǎn)置等優(yōu)化。
高斯濾波廣泛應(yīng)用于減弱圖像中的高斯噪聲,其計(jì)算過(guò)程就是對(duì)一幅圖像進(jìn)行加權(quán)平均的過(guò)程,每一個(gè)結(jié)果像素點(diǎn)的值都由相應(yīng)輸入圖像像素值與濾波核矩陣進(jìn)行相乘并累加后得到。令I(lǐng)是大小為m*n的輸入圖像矩陣,G(u,v)為高斯函數(shù),O為輸出結(jié)果矩陣,則濾波過(guò)程定義如式(1)所示:
(1)
針對(duì)本文高斯濾波,G(u,v)定義如式(2)所示:
(2)
其中,u0和v0是均值,代表中心點(diǎn)坐標(biāo),一般取值為0;δ2是方差,代表高斯曲線的寬度[10,11]。
濾波就是對(duì)輸入圖像進(jìn)行模糊的過(guò)程,可以理解成每一個(gè)像素點(diǎn)的值都用其周邊像素點(diǎn)的值的加權(quán)平均值代替。中間像素點(diǎn)的值用周?chē)袼攸c(diǎn)的值的平均值代替,中間像素點(diǎn)的值取周?chē)袼攸c(diǎn)的值的均值代替,會(huì)使中間像素點(diǎn)失去細(xì)節(jié),圖像上就會(huì)產(chǎn)生模糊效果。但是,在計(jì)算過(guò)程中存在周?chē)袼貦?quán)重分配的問(wèn)題,如果使用簡(jiǎn)單的平均顯然是不合理的,因?yàn)閳D像都是連續(xù)的,越靠近中間點(diǎn)的像素與中間點(diǎn)的相關(guān)性越強(qiáng)。因此,加權(quán)平均的計(jì)算方式更合理,距離中心點(diǎn)越近的像素點(diǎn)權(quán)重越大,距離中心點(diǎn)越遠(yuǎn)的像素點(diǎn)權(quán)重越小。由于高斯分布在形狀上是一種鐘形曲線,因此高斯分布是一種可取的權(quán)重分配模式。
在目前常用的圖像處理庫(kù)中,高斯濾波一般有2種實(shí)現(xiàn)方式,一種是借助快速傅里葉變換FFT(Fast Fourier Transform)實(shí)現(xiàn),一種是使用離散化高斯窗口在原圖像上進(jìn)行滑動(dòng)卷積?;诳焖俑道锶~變換的高斯濾波實(shí)現(xiàn)如圖1所示,分別將輸入圖像矩陣和濾波核矩陣進(jìn)行二維FFT計(jì)算,根據(jù)時(shí)域計(jì)算與頻域計(jì)算的對(duì)應(yīng)關(guān)系,可將時(shí)域中的卷積計(jì)算轉(zhuǎn)換成頻域中的復(fù)乘運(yùn)算,最后通過(guò)二維逆傅里葉變換得到最終的結(jié)果矩陣。該方法的優(yōu)點(diǎn)是計(jì)算量與卷積核的大小無(wú)關(guān),因此針對(duì)卷積核尺寸較大的卷積網(wǎng)絡(luò),F(xiàn)FT方法相比直接卷積方法在降低計(jì)算量方面具有明顯的優(yōu)勢(shì),其不足之處就是要付出增加存儲(chǔ)開(kāi)銷(xiāo)的代價(jià)[11]。但是,一般濾波采用的卷積核尺寸都比較小,因此可以選擇使用離散化高斯窗口在原圖像上進(jìn)行滑動(dòng)卷積的方式實(shí)現(xiàn)高斯濾波。
Figure 1 Gaussian filtering implementation based on Fourier transform圖1 基于傅里葉變換的高斯濾波實(shí)現(xiàn)
通過(guò)離散化高斯窗口在原圖像上進(jìn)行滑動(dòng)卷積時(shí),先通過(guò)二維高斯函數(shù)生成二維高斯核,移動(dòng)高斯核,將該高斯核與輸入圖像的相應(yīng)位置像素點(diǎn)相乘累加得到相應(yīng)位置的濾波結(jié)果。圖2給出了使用3*3高斯核進(jìn)行滑動(dòng)卷積的示意圖,在計(jì)算像素點(diǎn)I(1,1)濾波結(jié)果時(shí),用高斯濾波核G覆蓋以像素點(diǎn)I(1,1)為中心點(diǎn)的3*3圖像區(qū)域,高斯核G與圖像區(qū)域內(nèi)相對(duì)應(yīng)的像素點(diǎn)數(shù)據(jù)相乘并累加,便可得到I(1,1)像素點(diǎn)的高斯濾波處理結(jié)果O(1,1)。計(jì)算I(1,2)像素點(diǎn)時(shí),將高斯核G向右移一個(gè)像素的位置并重復(fù)上面的計(jì)算過(guò)程。
Figure 2 Schematic diagram of 3*3 Gaussian kernel sliding convolution圖2 3*3高斯核滑動(dòng)卷積示意圖
根據(jù)高斯函數(shù)的性質(zhì),二維高斯函數(shù)可以寫(xiě)成2個(gè)一維高斯函數(shù)相乘的形式,因此可以采用可分離濾波器來(lái)實(shí)現(xiàn)高斯濾波的加速計(jì)算。所謂的可分離濾波器,就是把多維卷積轉(zhuǎn)換成多個(gè)一維卷積,二維的高斯濾波就是指先對(duì)行做一維卷積,再對(duì)列做一維卷積。
定義一維高斯函數(shù)為G(u),則:
(3)
根據(jù)式(2)中二維高斯函數(shù)的定義,可得:
(4)
根據(jù)式(4),對(duì)式(1)中的卷積計(jì)算進(jìn)行改寫(xiě):
(5)
式(5)說(shuō)明了高斯濾波的可分離特性,輸入圖像矩陣與二維高斯濾波核卷積等價(jià)于先對(duì)輸入矩陣在水平方向與一維行高斯核進(jìn)行卷積,再將卷積結(jié)果在垂直方向與一維列高斯核進(jìn)行卷積。相對(duì)于二維滑動(dòng)卷積該實(shí)現(xiàn)方法可以明顯降低算法復(fù)雜度,在數(shù)據(jù)訪問(wèn)中,分離濾波可以更好地實(shí)現(xiàn)數(shù)據(jù)的連續(xù)訪存,提高數(shù)據(jù)局部性。因此,本文將基于FT系列處理器在分離濾波的基礎(chǔ)上實(shí)現(xiàn)高斯濾波的并行計(jì)算。
FT-M7002是國(guó)防科技大學(xué)自主研發(fā)的一款40 nm工藝的高性能DSP處理器芯片,該芯片包含1個(gè)RISC CPU核和2個(gè)FT-MT2 DSP核。單個(gè)計(jì)算核擁有32 KB的一級(jí)數(shù)據(jù)緩存和512 KB的陣列存儲(chǔ)器AM(Array Memory)空間,核外擁有32 GB的大容量DDR存儲(chǔ)空間[12,13],在圖像處理等需要進(jìn)行大量數(shù)據(jù)運(yùn)算的場(chǎng)合下能很好地發(fā)揮其優(yōu)勢(shì),或嵌入到其他系統(tǒng)中作為信號(hào)協(xié)處理模塊。本文主要針對(duì)單個(gè)DSP核進(jìn)行算法實(shí)現(xiàn),因此主要關(guān)注單個(gè)核內(nèi)結(jié)構(gòu)。
FT-MT2內(nèi)核基于VLIW結(jié)構(gòu),具體結(jié)構(gòu)如圖3所示,SPU(Scalar Processing Unit)表示標(biāo)量處理部件,VPU(Vector Processing Unit)表示向量處理部件,SVR(Scalar Vector Register)表示標(biāo)向量共享寄存器,SPE(Scalar Processing Element)表示標(biāo)量處理單元,SM(Scalar Memory)表示標(biāo)量存儲(chǔ)器。在該內(nèi)核結(jié)構(gòu)中,SPU和VPU為相互獨(dú)立又相互關(guān)聯(lián)的處理部件,SPU負(fù)責(zé)控制和邏輯計(jì)算,VPU主要面向密集型計(jì)算,SPU和VPU可以通過(guò)SVR進(jìn)行數(shù)據(jù)交互,并且通過(guò)廣播操作支持標(biāo)量寄存器到向量寄存器的廣播操作。
向量處理部件(VPU)由16個(gè)同構(gòu)向量處理單元VPE(Vector Processing Element)和混洗/歸約部件構(gòu)成[14],VPE內(nèi)部集成4個(gè)運(yùn)算部件用于支持標(biāo)量定點(diǎn)和浮點(diǎn)運(yùn)算。AM作為向量數(shù)據(jù)存儲(chǔ)器,為VPU提供向量數(shù)據(jù),同時(shí)AM可通過(guò)DMA與核外存儲(chǔ)空間進(jìn)行數(shù)據(jù)交互。也就是說(shuō)該VPU可以同時(shí)對(duì)16路32位數(shù)據(jù)進(jìn)行向量運(yùn)算,并且支持混洗/規(guī)約操作,針對(duì)數(shù)據(jù)密集型運(yùn)算能大量減少數(shù)據(jù)訪存次數(shù),提高運(yùn)算效率。
Figure 3 FT-MT2 core structure圖3 FT-MT2內(nèi)核結(jié)構(gòu)
在分析了FT-M7002體系結(jié)構(gòu)之后,本文結(jié)合該向量處理器內(nèi)核特點(diǎn)與高斯濾波算法性能瓶頸,針對(duì)高斯濾波中密集數(shù)據(jù)訪問(wèn)設(shè)計(jì)了優(yōu)化實(shí)現(xiàn),能夠明顯減少訪存次數(shù),最后為進(jìn)一步提升算法性能設(shè)計(jì)了相應(yīng)的數(shù)據(jù)傳輸優(yōu)化。
與二維高斯核滑動(dòng)卷積計(jì)算高斯濾波相比,分離濾波器能夠減少計(jì)算量,提高訪存的局部性,但是當(dāng)輸入圖像較大時(shí),內(nèi)存訪問(wèn)量依然很大,影響算法性能。因此,本文結(jié)合FT-M7002體系結(jié)構(gòu)特點(diǎn),設(shè)計(jì)一種基于分離濾波器的高斯濾波優(yōu)化實(shí)現(xiàn)過(guò)程,通過(guò)充分利用FT-MT2內(nèi)核中的VPU減少內(nèi)存訪問(wèn)次數(shù),在保證正確性的基礎(chǔ)上提高高斯濾波算法性能。
高斯濾波算法主要由生成高斯卷積核、邊界填充、行濾波、列濾波4部分構(gòu)成,其中行濾波和列濾波部分存在大量密集數(shù)據(jù)訪問(wèn),因此本文主要針對(duì)這2部分進(jìn)行優(yōu)化實(shí)現(xiàn)。本文對(duì)于列濾波的訪存不連續(xù)進(jìn)行相應(yīng)的DMA數(shù)據(jù)轉(zhuǎn)置優(yōu)化,此外針對(duì)算法中DMA傳輸耗時(shí)進(jìn)行了相應(yīng)的優(yōu)化設(shè)計(jì)。
根據(jù)圖3中FT-M7002內(nèi)核結(jié)構(gòu)可知,VPE從AM中讀取數(shù)據(jù)進(jìn)行運(yùn)算,比如vec_ld向量指令,從AM中連續(xù)加載16個(gè)32位數(shù)據(jù)放在VPE0~VPE15中,而SM主要為標(biāo)量操作提供數(shù)據(jù)支持。在高斯濾波中,一般來(lái)說(shuō)高斯核矩陣的規(guī)模都比較小,而且根據(jù)算法的需要,高斯核數(shù)據(jù)需要標(biāo)量讀取,因此將高斯核數(shù)據(jù)置于SM中,輸入矩陣置于AM或DDR中。針對(duì)行列濾波部分,圖4給出了3*3高斯核與輸入圖像矩陣進(jìn)行濾波操作示意圖,其中,I表示輸入圖像矩陣,cn表示輸入圖像通道數(shù),G表示高斯濾波核矩陣。通過(guò)FT-M7002向量指令分別從AM按行加載16個(gè)輸入矩陣數(shù)據(jù),從SM中廣播對(duì)應(yīng)高斯核數(shù)據(jù)到VPE中進(jìn)行向量乘加運(yùn)算,可以看到該方法可以明顯減少訪存次數(shù),且充分復(fù)用已取數(shù)據(jù)。
Figure 4 Schematic diagram of 3*3 Gaussian kernel line filtering optimization圖4 3*3高斯核行濾波優(yōu)化實(shí)現(xiàn)示意圖
基于可分離濾波器的高斯濾波主要由生成高斯卷積核、邊界填充、行濾波和列濾波4部分構(gòu)成,經(jīng)過(guò)分析高斯濾波算法主要循環(huán)層都在行列濾波部分,因此本文主要對(duì)行列濾波部分進(jìn)行并行性?xún)?yōu)化。結(jié)合FT-M7002體系結(jié)構(gòu)特點(diǎn),為充分利用核內(nèi)VPU,減少訪存操作,本文采用FT-M7002向量指令集完成行濾波操作,可以有效地并行開(kāi)發(fā)程序,提高數(shù)據(jù)集并行性。下面給出了行列濾波中核心段優(yōu)化代碼,相對(duì)于串行程序,該優(yōu)化代碼一次循環(huán)可以處理16個(gè)數(shù)據(jù),明顯減少內(nèi)層循環(huán)次數(shù)。其中,cn代表輸入圖像通道數(shù),當(dāng)輸入圖像尺寸不是16的倍數(shù)時(shí)需要增加尾循環(huán)。當(dāng)濾波核較小時(shí)可將其全部廣播到VPE中完成與輸入矩陣的乘加操作,當(dāng)濾波核較大時(shí),需要增加一層循環(huán)來(lái)控制廣播到VPE中的卷積核,會(huì)增加整個(gè)算法的時(shí)間,由于高斯濾波常用3*3,5*5高斯核,因此將不同尺寸高斯核分開(kāi)可提升較小高斯核計(jì)算性能。
before
fori=0:1:row
forj=0:1:col*cn
S0=0;
g=j;
fork=0:1:ksize
S0 +=G[k]*I[i][g];
g+=cn;
endfor
O[i][j]=S0;
endfor
endfor
input:輸入矩陣I。
output:結(jié)果矩陣O。
after
ifksizeis 3 or 5 or 7, for exampleksizeis 3
vectorG(1)=vec_svbcast(G(1)); /*Broadcast Gaussian core to VPE*/
vectorG(2)=vec_svbcast(G(2)); /*Broadcast Gaussian core to VPE*/
vectorG(3)=vec_svbcast(G(3)); /*Broadcast Gaussian core to VPE*/
fori=0:1:row
M7002_vector int *I_cn= (M7002_vector int *)0x040000000; /*Define pointer to AM*/
M7002_vector int *O_cn= (M7002_vector int *)0x040040000;
M7002_datatrans_cv(I,I_cn,(col+ksize) * 4); /*DMA transfer input matrixIto AM*/
forj1=0:16:col*cn-16 //parallel for data
vectorI1=vec_ld(j1,I_cn);
vectorI2=vec_ld(j1+cn,I_cn);
vectorI3=vec_ld(j1+2cn,I_cn);
vectorO1=vec_mul(vectorG(1),vectorI1);
vectorO2=vec_mul(vectorG(2),vectorI2);
vectorO3=vec_mul(vectorG(3),vectorI3);
vectorO=vec_add(vectorO1,vec_add(vectorO2,vectorO3));
vec_st(vectorO,j1,O_cn);
endfor
M7002_datatrans_cv(O_cn,O,j1);
forj2=j1:1:col*cn/*ifcol%16 !=0*/
O(i,j2)=G(1)*I(i,j2)+G(2)*I(i,j2+cn)*G(3)*I(i,j2+2cn);
endfor
endfor
AM為VPU提供向量數(shù)據(jù)訪問(wèn)時(shí),可同時(shí)支持2個(gè)向量數(shù)據(jù)的load/store操作以及標(biāo)量單元和DMA的向量數(shù)據(jù)訪問(wèn),且VPE有4條可并行執(zhí)行的流水線。為充分利用FT-M7002的以上優(yōu)勢(shì),本文采用循環(huán)展開(kāi)發(fā)掘高斯濾波向量算法的指令級(jí)并行性。若對(duì)上述行濾波部分進(jìn)行2次循環(huán)展開(kāi),則1次循環(huán)可以處理64個(gè)數(shù)據(jù),對(duì)于輸入尺寸較小的圖像無(wú)法達(dá)到預(yù)期優(yōu)化效果。因此,本文進(jìn)行1次循環(huán)展開(kāi),1次循環(huán)處理32個(gè)數(shù)據(jù),并對(duì)剩余數(shù)據(jù)設(shè)置尾循環(huán)處理,充分發(fā)揮高斯濾波算法的指令級(jí)并行性。
由于AM存儲(chǔ)空間有限,當(dāng)輸入矩陣較大時(shí)AM一次不能加載整個(gè)卷積矩陣,此時(shí)輸入數(shù)據(jù)需要存放在核外共享空間DDR中并通過(guò)DMA傳輸?shù)紸M,DMA傳輸?shù)臅r(shí)間會(huì)影響整個(gè)算法的性能,且列濾波過(guò)程中存在數(shù)據(jù)的不連續(xù)訪問(wèn),導(dǎo)致無(wú)法進(jìn)行向量讀寫(xiě)。為了使DMA傳輸與FT-MT2內(nèi)核計(jì)算并行,從而隱藏DMA傳輸時(shí)間;為了使列濾波計(jì)算部分能夠連續(xù)讀取,從而使該部分能夠向量化實(shí)現(xiàn),本節(jié)主要實(shí)現(xiàn)了DMA傳輸優(yōu)化。
(1)為提高行濾波計(jì)算的速度,用“乒-乓”的方式進(jìn)行DMA數(shù)據(jù)傳輸,可將FT-MT2內(nèi)核計(jì)算與DMA數(shù)據(jù)傳輸并行實(shí)現(xiàn)。此時(shí)將AM空間按地址劃分為相等的2部分,分別為Buffer0和Buffer1,先將數(shù)據(jù)從DDR中通過(guò)DMA傳輸?shù)紹uffer0,由于Buffer0中需要保留一部分空間來(lái)存放計(jì)算結(jié)果,因此傳輸?shù)臄?shù)據(jù)大小應(yīng)該為Buffer0空間的一半。然后從Buffer0開(kāi)始計(jì)算,Buffer0計(jì)算的同時(shí),Buffer1進(jìn)行數(shù)據(jù)傳輸,當(dāng)Buffer1開(kāi)始計(jì)算時(shí),Buffer0輸出上一次的計(jì)算結(jié)果并啟動(dòng)新數(shù)據(jù)傳輸,采用“乒-乓”的數(shù)據(jù)傳輸方式可以將計(jì)算時(shí)間和傳輸時(shí)間重疊起來(lái),提高算法的執(zhí)行效率。
(2)該算法實(shí)現(xiàn)中列濾波過(guò)程存在不連續(xù)訪存,無(wú)法通過(guò)向量指令進(jìn)行連續(xù)存取,因此需要對(duì)行濾波結(jié)果進(jìn)行轉(zhuǎn)置變換,以實(shí)現(xiàn)列濾波的連續(xù)讀取。FT-M7002中的DMA傳輸模塊可以由設(shè)計(jì)人員自行配置傳輸方式,比如可以根據(jù)設(shè)置的幀索引值對(duì)相鄰2個(gè)幀的首數(shù)據(jù)單元進(jìn)行地址跳變的讀或?qū)?,因此可以通過(guò)適當(dāng)配置DMA的索引值,實(shí)現(xiàn)矩陣的轉(zhuǎn)置。如使用DMA將DDR中的行濾波結(jié)果矩陣O1中的第1行按列存儲(chǔ)在AM的O2中,DMA配置中目的幀索引值配置為O2每行首元素的地址差,則DMA會(huì)將O1[0][1]根據(jù)索引值間隔搬移到O2[1][0]中,O1[0][2]搬移到O2[2][0]中,依此將矩陣O1中第1行轉(zhuǎn)置到矩陣O2中第1列,然后完成剩余行的轉(zhuǎn)置。
本節(jié)介紹在FT-M7002平臺(tái)上高斯濾波算法優(yōu)化實(shí)現(xiàn)相對(duì)于高斯濾波串行算法的性能提升,以3*3和5*5的高斯核為例,分析不同尺寸輸入圖像對(duì)算法加速比的影響,同時(shí)與TMS320C6678中高斯濾波算法性能進(jìn)行對(duì)比,分析2類(lèi)處理器的單核計(jì)算能力。
在飛騰平臺(tái)的FT-M7002處理器上實(shí)現(xiàn)高斯濾波算法優(yōu)化,調(diào)用定時(shí)器的計(jì)時(shí)函數(shù)記錄該算法執(zhí)行時(shí)間,使用TI平臺(tái)的高性能數(shù)字信號(hào)處理器TMS320C6678進(jìn)行對(duì)比分析,具體實(shí)驗(yàn)環(huán)境如表1所示。
Table 1 Experimental platform parameters表1 實(shí)驗(yàn)平臺(tái)參數(shù)
面向飛騰平臺(tái)的高斯濾波優(yōu)化算法能夠在具體應(yīng)用中使用的基礎(chǔ)是濾波結(jié)果的正確性,同時(shí)在保證正確性的基礎(chǔ)上提高算法執(zhí)行效率是本文優(yōu)化的目的。因此,本次實(shí)驗(yàn)的內(nèi)容主要有2部分,分別是正確性驗(yàn)證和性能提升驗(yàn)證。
正確性驗(yàn)證:在FT平臺(tái)上編寫(xiě)程序,調(diào)用前面實(shí)現(xiàn)的高斯濾波優(yōu)化算法,使用FT-M7002編譯器編譯程序?yàn)榭蓤?zhí)行文件,加載可執(zhí)行文件到FT-M7002處理器中運(yùn)行并保存運(yùn)行結(jié)果,與Intel開(kāi)發(fā)的OpenCV圖像庫(kù)中高斯濾波結(jié)果進(jìn)行對(duì)比。
性能提升驗(yàn)證:性能提升驗(yàn)證包含2部分,分別是在FT-M7002中相對(duì)于串行高斯濾波算法的加速比,以及相對(duì)于TI平臺(tái)的計(jì)算性能。
(1)正確性分析。
以3*3和5*5的高斯核為例,在FT平臺(tái)上運(yùn)行高斯濾波優(yōu)化算法并打印結(jié)果矩陣,與Intel開(kāi)發(fā)的OpenCV圖像庫(kù)中高斯濾波結(jié)果進(jìn)行對(duì)比。將2個(gè)結(jié)果相減取絕對(duì)值,以萬(wàn)分之一為標(biāo)準(zhǔn),精確度小于萬(wàn)分之一的認(rèn)為結(jié)果正確。結(jié)果如表2所示,對(duì)于不同尺寸的輸入圖像,本文算法均能取得正確的處理結(jié)果。
Table 2 Results of correctness analysis表2 結(jié)果正確性分析
(2)加速比分析。
選取高斯濾波常用3*3和5*5高斯核,分別運(yùn)行高斯濾波串行算法與高斯濾波優(yōu)化算法并記錄運(yùn)行時(shí)間。在FT-M7002處理器上的測(cè)試結(jié)果如圖5所示,橫坐標(biāo)表示濾波矩陣規(guī)模,縱坐標(biāo)表示本文算法相對(duì)于串行高斯濾波算法的加速比??梢钥闯鰧?duì)于不同大小的輸入圖像,優(yōu)化后高斯濾波算法能取得1.3~1.41倍的加速比,由于DMA傳輸耗時(shí)以及算法中生成高斯濾波核、邊界填充等模塊耗時(shí)的影響,該算法性能提升沒(méi)有達(dá)到理論值。
Figure 5 Speedup of optimized Gaussian filtering algorithm圖5 優(yōu)化后高斯濾波算法加速比
從趨勢(shì)上來(lái)看,在濾波核規(guī)模一定的情況下,算法加速比隨著濾波矩陣規(guī)模的增加先增加,后趨于穩(wěn)定。主要原因在于,本文算法將讀入數(shù)據(jù)都放在DDR存儲(chǔ)空間中,由于數(shù)據(jù)傳輸耗時(shí)導(dǎo)致加速效果達(dá)不到理論值,但是隨著輸入數(shù)據(jù)的增大,DMA傳輸耗時(shí)所占比重變小,加速效果也有所提升。對(duì)于不同高斯核,可以看出,高斯核規(guī)模越大加速效果越明顯,主要原因是,高斯核越大,每次循環(huán)中計(jì)算的數(shù)據(jù)越多,因此優(yōu)化后的算法能更好地提升循環(huán)內(nèi)數(shù)據(jù)的并行性。
在TMS320C6678中運(yùn)行高斯濾波算法并在FT-M7002中運(yùn)行本文優(yōu)化算法,分別使用TI與FT平臺(tái)的計(jì)時(shí)函數(shù)記錄運(yùn)行時(shí)間。在FT-M7002中運(yùn)行本文優(yōu)化算法時(shí)需要先開(kāi)啟Cache選項(xiàng),測(cè)試結(jié)果如圖6所示,結(jié)果表明,對(duì)于不同尺寸濾波圖像,F(xiàn)T-M7002向量處理器相對(duì)于TI多核處理器取得了1.15~1.71倍的加速比。可以看出在濾波核規(guī)模一定的情況下,相對(duì)于TI平臺(tái),F(xiàn)T平臺(tái)處理不同尺寸圖像的性能加速基本相同,但是在圖像尺寸一定的情況下,5*5高斯核的FT平臺(tái)相對(duì)于TI平臺(tái)的性能加速明顯高于3*3高斯核的。
相對(duì)于TI處理器,F(xiàn)T處理器有更長(zhǎng)的向量寄存器,因此單核運(yùn)算中,針對(duì)計(jì)算密集型程序FT平臺(tái)相對(duì)于TI平臺(tái)有一定的計(jì)算優(yōu)勢(shì)。
Figure 6 Speedup comparison of optimized Gaussian filtering algorithm with Gaussian filtering algorithm on TI6678圖6 優(yōu)化后高斯濾波算法相對(duì)于TI6678中高斯濾波算法加速比
針對(duì)國(guó)產(chǎn)高性能DSP的快速發(fā)展過(guò)程中缺乏相應(yīng)軟件應(yīng)用的問(wèn)題,本文在深入理解高斯濾波算法的基礎(chǔ)上,對(duì)高斯濾波算法進(jìn)行了針對(duì)FT-M7002 DSP的體系結(jié)構(gòu)特點(diǎn)的優(yōu)化實(shí)現(xiàn)。為了充分利用該平臺(tái)的核內(nèi)資源,本文使用編譯器內(nèi)嵌指令進(jìn)行手工向量化改寫(xiě),并使用控制流消除、循環(huán)展開(kāi)等方法挖掘指令級(jí)并行性。同時(shí),通過(guò)使用“乒-乓”緩存的方式實(shí)現(xiàn)了DMA數(shù)據(jù)傳輸與向量計(jì)算的并行。為了避免計(jì)算階段出現(xiàn)向量訪存不連續(xù),在列濾波計(jì)算階段對(duì)數(shù)組進(jìn)行轉(zhuǎn)置存放。本文在多種濾波核大小及圖像矩陣規(guī)模下進(jìn)行了性能測(cè)試,結(jié)果表明:相對(duì)于沒(méi)有進(jìn)行優(yōu)化的串行實(shí)現(xiàn),優(yōu)化后閾值分割算法獲得了1.3~1.41倍的加速比。同時(shí),相較于dsplib庫(kù)中高斯濾波算法在TMS320C6678平臺(tái)上的運(yùn)行性能,獲得了1.15~1.71倍的加速效果,驗(yàn)證了本文優(yōu)化實(shí)現(xiàn)的有效性以及FT DSP核的計(jì)算性能優(yōu)勢(shì)。然而,該優(yōu)化實(shí)現(xiàn)目前只針對(duì)32位輸入數(shù)據(jù)類(lèi)型,下一步將面向FT DSP核繼續(xù)完善高斯濾波算法,使其支持更多數(shù)據(jù)類(lèi)型。