,,,
(湖北大學(xué) 計算機(jī)與信息工程學(xué)院, 武漢 430062)
圖像邊緣作為圖像最基本的特征,是圖像進(jìn)行相關(guān)處理(如圖像分割等)的主要基礎(chǔ)。在進(jìn)行圖像處理的過程中,圖像邊緣檢測技術(shù)對圖像處理具有十分重要的意義。獲取比較好的圖像邊緣有助于去除不必要的圖像信息,同時保留圖像形狀等重要信息。在實時圖像處理中,通用軟件算法進(jìn)行邊緣檢測一般在實時性方面效果欠佳,如Sobel邊緣檢測算法;在硬件實現(xiàn)層面,如何使用高性能計算來實現(xiàn)提高圖像處理速度,簡化算法來提高算法運行速度的研究較少。
目前,異構(gòu)計算因為其高性能并行處理的特性逐漸被應(yīng)用到圖像處理中[1]。在PC領(lǐng)域中,研究人員已經(jīng)大量采用圖形處理器(GPU:graphics processing unit)進(jìn)行圖像處理計算[2],然而在嵌入式領(lǐng)域采用異構(gòu)系統(tǒng)進(jìn)行邊緣識別的應(yīng)用較少。FPGA(field programmable gate array)的可重構(gòu)性和高度并行性在高性能計算上具有很大的優(yōu)勢,F(xiàn)PGA內(nèi)部邏輯資源可以靈活地實現(xiàn)許多算法,并在相當(dāng)短的時鐘周期內(nèi)完成大量的高性能計算,但FPGA算法實現(xiàn)需要由經(jīng)驗豐富的邏輯工程師來完成,其開發(fā)流程也比較繁瑣。OpenCL(Open Computing Language)跨平臺開發(fā)語言為異構(gòu)計算的開發(fā)帶來了極大便利,開發(fā)人員可以從復(fù)雜的異構(gòu)系統(tǒng)構(gòu)建和通信機(jī)制中擺脫出來,專心研究算法實現(xiàn)和優(yōu)化。另外,OpenCL對圖像數(shù)據(jù)類型支持較好,非常適用于圖像的像素操作。因此,OpenCL與FPGA異構(gòu)模式的結(jié)合在嵌入式圖像高性能處理上具有相當(dāng)大的優(yōu)勢,本文基于該模式對Sobel算法的并行性進(jìn)行研究。
在分析Sobel算法并行性和展開性能之前,需要了解Sobel算法原理、OpenCL在FPGA上的并行性和共享內(nèi)存機(jī)制。
Sobel算子是圖像邊緣檢測中常用的一種梯度幅值檢測算子,采用3*3卷子模板同時在水平方向和垂直方向?qū)D像進(jìn)行卷積,計算出與目標(biāo)圖像亮度函數(shù)的灰度近似值的一個離散性的差分算子,通過該算子得到目標(biāo)圖像任意一點上的灰度矢量[3]。
Sobel卷積因子為如圖1所示,gx為水平方向梯度模板,gy為垂直方向梯度模板,兩個模板和目標(biāo)圖像進(jìn)行平面卷積,就可以得到該圖像在水平和垂直方向上相應(yīng)的亮度差分近似值。
圖1 Sobel卷積因子
設(shè)A為圖像中任意3*3的像素矩陣,如式(1),式中f(x,y)為圖像中任意像素點的灰度值。通過Sobel邊緣檢測運算后,得到水平和垂直方向的灰度值Gx和Gy,如式(2)和式(3)所示。
(1)
(2)
(3)
Gx和Gy的計算結(jié)果如式(4)和(5)。
Gx=[f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-
[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]
(4)
Gy=[f(x-1,y-1)+2*f(x,y-1)+f(x+1,y-1)]-
[f(x-1,y+1)+2*f(x,y+1)+f(x+1,y+1)]
(5)
通過式(6),計算目標(biāo)像素灰度值G的大小,將灰度值G與設(shè)定的閾值比較,即可判斷該像素點是否為邊緣點。
(6)
Altera Cyclone V SOC芯片在傳統(tǒng)的FPGA芯片內(nèi)嵌一個HPS(硬核處理系統(tǒng)),該硬核處理系統(tǒng)包括一個雙核的Cortex-A9處理器及其外設(shè),F(xiàn)PGA與HPS之間有多條內(nèi)部互聯(lián)總線相連,保證了HPS和FPGA之間的高速數(shù)據(jù)交換。
Altera OpenCL SDK是Altera 公司提供的OpenCL開發(fā)套件,其支持以Cyclone V SOC 芯片為基礎(chǔ)的OpenCL計算架構(gòu)。HPS中的ARM作為OpenCL的主機(jī),主要負(fù)責(zé)流程控制和OpenCL 運行時(RunTime);而FPGA則作為OpenCL計算設(shè)備。
Altera為基于Cyclone V SoC的OpenCL平臺提供了一個OpenCL 板級支持包(BSP)。該BSP包括OpenCL運行的基本硬件結(jié)構(gòu),并預(yù)留與OpenCL內(nèi)核邏輯黑盒連接的接口。OpenCL SDK能夠?qū)?nèi)核代碼編譯為FPGA運算邏輯,取代該部分黑盒邏輯,連接在OpenCL接口上。在進(jìn)行OpenCL計算時,ARM主機(jī)動態(tài)加載該部分運算邏輯配置FPGA進(jìn)行計算。
在OpenCL的內(nèi)存模型中,Host內(nèi)存和Device 內(nèi)存通常是獨立的(如CUP內(nèi)存和GPU顯存)。由于OpenCL環(huán)境中Device為計算設(shè)備,需要將Host內(nèi)存中的數(shù)據(jù)拷貝到Device內(nèi)存中計算。在計算結(jié)束后,需要將設(shè)備內(nèi)存中的計算結(jié)果拷貝到主機(jī)內(nèi)存中進(jìn)行后續(xù)處理。對于高內(nèi)存消耗型的計算來講,主機(jī)和設(shè)備之間數(shù)據(jù)的拷貝將會消耗許多時間,從而降低OpenCL計算的性能優(yōu)勢。Altera的CycloneV SOC芯片支持OpenCL的共享物理內(nèi)存模式的內(nèi)存訪問,F(xiàn)PGA和HPS可以通過其芯片內(nèi)部的DDR內(nèi)存控制器硬核訪問內(nèi)存的共享區(qū)域,以避免主機(jī)和設(shè)備之間的數(shù)據(jù)拷貝。
在硬件方面,Cyclone V SOC芯片內(nèi)有一個特殊的DDR內(nèi)存控制器硬核,F(xiàn)PGA和HPS均可通過該控制器訪問內(nèi)存。FPGA在訪問內(nèi)存時,無需通過HPS系統(tǒng)中的AXI總線和L3互聯(lián)交換系統(tǒng),直接通過FPGA-to-HPS橋訪問SDRAM控制器,如圖2所示。因為FPGA是訪問共享物理內(nèi)存,而不是共享虛擬內(nèi)存,所以它不需訪問將用戶虛擬地址映射到物理頁地址的CPU頁面表。這種方式不僅有更好的數(shù)據(jù)帶寬,且不會占用AXI總線干涉HPS對其他外設(shè)的訪問。
圖2 FPGA在訪問SDRAM
在軟件方面,主機(jī)必須能夠分配物理連接的內(nèi)存區(qū)域,來與設(shè)備中的連續(xù)內(nèi)存空間保持一致。在CPU上分配內(nèi)存的典型軟件(例如,malloc()函數(shù)) 并不能保證分配到連續(xù)的物理內(nèi)存。在Linux上的用戶空間應(yīng)用程序中,Malloc()函數(shù)分配的內(nèi)存在虛擬內(nèi)存地址空間中是連續(xù)的,但任何底層物理頁面可能不是鄰接的物理頁面。因此,Linux內(nèi)核驅(qū)動程序必須執(zhí)行內(nèi)存分配。
OpenCL SoC FPGA Linux內(nèi)核驅(qū)動程序中通過調(diào)用dma_alloc_coherent()來分配連續(xù)的物理內(nèi)存,并將其映射到用戶空間。為了保證內(nèi)存一致性,驅(qū)動還需要調(diào)用pgprot_noncached()或者remap_pf_range()來禁止該部分內(nèi)存的cache訪問。一方面, mmp()將完成驅(qū)動分配內(nèi)存的映射,返回主機(jī)程序所需要的虛擬地址。另一方面,通過查詢驅(qū)動,OpenCL內(nèi)核可以獲取該內(nèi)存所對應(yīng)的實際物理地址。
OpenCL運行時,使用clCreateBuffer()和CL_MEM_USE_HOST_PTR標(biāo)簽來申請分配共享內(nèi)存并返回設(shè)備地址指針;通過clEnqueueMapBuffer()和設(shè)備地址指針獲取共享內(nèi)存的主機(jī)地址指針,二者將對應(yīng)到物理內(nèi)存的同一塊區(qū)域。Intel FPGA SDK假定共享內(nèi)存是board_spec.xml文件中列出的第一個內(nèi)存。通過FPGA與OpenCL的共享內(nèi)存方式,減少OpenCL內(nèi)核與數(shù)據(jù)的拷貝時間,進(jìn)一步提高系統(tǒng)運行速度。
為設(shè)計對比實驗,本文將Sobel處理的模型抽象為圖3的模型,主要包括圖像輸入RGB緩存區(qū),圖像算法和圖像輸出緩存區(qū)。通過純軟件和OpenCL的方式分別實現(xiàn)Sobel算法核心,完成相同的功能,并對不同實現(xiàn)方式進(jìn)行對比分析。
圖3 Sobel處理的模型
基于上述模型,Sobel的軟件和OpenCL實現(xiàn)都將在友晶科技的DE1-SOC硬件平臺上實現(xiàn)。Sobel的軟件算法運行在HPS的ARM硬核中,Sobel的OpenCL則由FPGA部分實現(xiàn),通過參數(shù)配置加載不同的算法核心完成Sobel的圖像處理。
由于軟件算法在ARM中實現(xiàn),軟件算法和OpenCL方式將共用一套平臺,該硬件設(shè)計主要為OpenCL的硬件設(shè)計。OpenCL開發(fā)環(huán)境的最小加速系統(tǒng),該系統(tǒng)包含OpenCL最小硬件系統(tǒng)、OpenCL加速子系統(tǒng)。
1)DE1-SOC硬件平臺核心為Altera的Cyclone V SoC FPGA芯片,核心芯片的FPGA邏輯資源和雙核心ARM處理器分別為OpenCL平臺模型中的設(shè)備和主機(jī)。
2)OpenCL最小硬件系統(tǒng)的主機(jī)包括HPS、板載DDR3 SDRAM內(nèi)存、SD卡、USB轉(zhuǎn)串口和使用FPGA邏輯資源搭建的OpenCL接口。最小系統(tǒng)的設(shè)計框圖如圖4所示。
圖4 OpenCL最小系統(tǒng)框圖
3)OpenCL加速系統(tǒng)的硬件設(shè)計主要是完成Sobel加速內(nèi)核的實現(xiàn)。內(nèi)核雖然以O(shè)penCL內(nèi)核代碼體現(xiàn),但這些代碼將直接決定其在FPGA內(nèi)的硬件結(jié)構(gòu)。內(nèi)核主要完成RGB-Gray的顏色轉(zhuǎn)換和Sobel卷積計算。
1)Sobel邊緣檢測算法C/C++實現(xiàn)。
Sobel邊緣檢測算法具體步驟如下。
Step1:將水平和垂直2個方向模板的中心像素與圖像的相應(yīng)像素點重合,并且將模板按照從左到右、從上到下方向沿著圖像像素移動。
Step2:將模板中的系數(shù)與對應(yīng)的圖像像素值進(jìn)行卷積運算。
Step3:用兩個模板得到卷積結(jié)果的最大值代替模板中心位置對應(yīng)的像素值,作為該像素新的像素灰度值。
Step4:設(shè)置合適的閾值TH,若新的像素灰度值≥TH,則判斷該像素點為邊緣點。
Sobel 算法通常使用圖像的灰度值與梯度系數(shù)進(jìn)行卷積,完成RGB圖像進(jìn)行Sobel圖像轉(zhuǎn)換輸出時,還需要進(jìn)行圖像顏色空間的轉(zhuǎn)換。
其中像素值為輸入彩色圖像像素點的RGB值根據(jù)公式1.7加權(quán)轉(zhuǎn)換為灰度圖像的像素值。
Gray=(77*R+151*G+28*B)>>8
(17)
上述步驟灰度值轉(zhuǎn)換中有兩種計算模型,首先介紹計算模型1,其結(jié)構(gòu)模型如圖5所示。
圖5 計算模型1
該模型首先從輸入圖像的RGB緩沖區(qū)每次提取9個像素點,同時依次完成顏色空間的轉(zhuǎn)換和Sobel卷積運算,計算出一個中心點的Sobel特征值。
代碼的行為將被翻譯成指令執(zhí)行,Soble算法中內(nèi)存的訪問(ldr/str指令)、加法運算(add指令)和乘法運算(vmul.f64 neno乘法指令)執(zhí)行的次數(shù)與程序執(zhí)行時間密切相關(guān)。于1個像素點的Gray 計算而言,灰度運算如表1所示。
表1 單個像素點灰度運算
其中,1次內(nèi)存訪問為讀取像素點的RGB值;3次乘法運算和2次加法為RGB顏色空間到Gray顏色空間的轉(zhuǎn)換。另外2次加法和3次移位操作為中間數(shù)據(jù)的數(shù)學(xué)計算。而每次計算一個Sobel特征值需要計算9個像素的灰度值和與對應(yīng)得系數(shù)值相乘,最后所有值相加,則Gray的內(nèi)存訪問和數(shù)據(jù)計算量為單次計算的9倍。所以該方法計算一個Sobel特征值總運算次數(shù)如表2所示,包括9*2次(橫向和縱向)灰度運算和1次Sobel運算。
表2 計算模型1的一個Sobel特征值運算
按照計算模型1,完成整張RGB圖像的Sobel需要關(guān)鍵運算量為Col*Row*單個Sobel特征值運算量。這種計算模型優(yōu)點是只需要一個輸入緩沖和一個輸出緩沖區(qū),占用的內(nèi)存空間較小,但是會存在計算灰度值是反復(fù)訪問內(nèi)存和重復(fù)計算灰度值的問題。這種方式在嵌入式應(yīng)用中,適合應(yīng)用于微處理器RAM資源本身很小,或者處理圖像較大占用的緩沖區(qū)過大而消耗過多內(nèi)存導(dǎo)致RAM資源緊缺的場景中。
在計算模型1分析的基礎(chǔ)上,增加一個緩沖區(qū)用于緩存灰度值數(shù)據(jù),先進(jìn)行RGB到灰度值的轉(zhuǎn)換,再取灰度值值進(jìn)行Sobel計算,來減少重復(fù)計算灰度值,其計算模型2如圖6所示。
圖6 計算模型2
同理分析可得計算模型2計算一個Sobel特征值總運算次數(shù)如表3表2所示。
表3 計算模型2的一個Sobel特征值運算
其中,灰度值轉(zhuǎn)換的2次內(nèi)存訪問為讀取像素點的RGB值和向緩存區(qū)存入Gray值;3次乘法運算和兩次加法為RGB顏色空間到Gray顏色空間的轉(zhuǎn)換,另外2次加法為中間數(shù)據(jù)的數(shù)學(xué)計算。
Sobel的計算時,將不再用Gray計算過程中寄存器存儲的Gray值來計算,而變?yōu)閺膬?nèi)存中讀取Gary值進(jìn)行計算,每個像素點的Sobel特征值的計算需要9次。
計算模型1直接將灰度值進(jìn)行數(shù)據(jù)運算,未分配內(nèi)存存放數(shù)據(jù),該方式所消耗的時間資源較多;計算模型2將圖像灰度值處理完后全部存放在分配的內(nèi)存中,該方式所消耗的存儲空間較多。計算模型2相對于計算模型1減少了灰度值的重復(fù)運算,提升了運行速度。
2)Sobel算法的并行實現(xiàn)。
由上述分析可知,Sobel算法的指令串行執(zhí)行是時間消耗的關(guān)鍵,OpenCL方法能使算法并行執(zhí)行從而降低計算開銷。Sobel算法的并行實現(xiàn)主要包括運行在DE1-SoC上執(zhí)行的OpenCL內(nèi)核程序和主機(jī)程序。
OpenCL內(nèi)核主要通過展開的for循環(huán)實現(xiàn)一組移位寄存器的行為,并在一次內(nèi)核計算中同時完成9個像素點的RGB-Gray的轉(zhuǎn)換和Sobel特征值的計算以及閾值比較輸出。通過OpenCL內(nèi)核,能在每個時鐘輸出一個Sobel運算結(jié)果。
假設(shè)圖片像素大小為COLS* ROWS,OpenCL內(nèi)核程序主要實現(xiàn)移位寄存器rows[2 * COLS + 3],讓移位寄存器前面3行3列共9個像素值轉(zhuǎn)換為灰度值,與橫向和縱向Sobel因子做平面卷積,以如圖7所示,以320*240像素大小的圖片為例, 構(gòu)成一個320*2+3大小的移位寄存器,灰色部分是用來計算Sobel的9個數(shù)據(jù),對應(yīng)一個 Sobel 卷積的計算單元。依次移位,即可完成下一個 Sobel 卷積的計算。每一個Sobel 卷積的計算單元對應(yīng)一個硬件的運算單元,這樣就可以每個時鐘出一個數(shù)據(jù),提高運算效率。
圖7 移位寄存器示例
主機(jī)程序?qū)崿F(xiàn)主要有以下步驟。
Step1:通過clGetPlatformInfo函數(shù)先獲得 OpenCL 的平臺信息,在此平臺上選定OpenCL設(shè)備,如DE1-SoC。
Step2:查詢硬件設(shè)備獲取OpenCL對各項指標(biāo)的支持能力。
Step3:通過clCreateContex函數(shù)創(chuàng)建上下文環(huán)境,通過上下文來管理命令隊列和內(nèi)存對象。
Step4:通過clCreateQueue函數(shù)創(chuàng)建命令隊列,OpenCL可以實現(xiàn)對內(nèi)存對象、程序?qū)ο蠛蛢?nèi)核對象的操作。
Step5:通過包含F(xiàn)PGA邏輯配置信息的二進(jìn)制內(nèi)核文件來創(chuàng)建編程對象,解決FPGA邏輯重構(gòu)問題。
Step6:通過clCreateKernel函數(shù)創(chuàng)建內(nèi)核,將內(nèi)核函數(shù)和主機(jī)程序關(guān)聯(lián)。
Step7:通過clSetKernelArg函數(shù)設(shè)置內(nèi)核參數(shù),綁定主機(jī)程序與內(nèi)核之間數(shù)據(jù)交換需要的參數(shù)。
Step8:通過clEnqueneNDRangeKernel函數(shù)執(zhí)行內(nèi)核,完成內(nèi)核在加速設(shè)備上的運行。
Step9:內(nèi)核執(zhí)行完成后,通過釋放函數(shù)釋放資源。
主機(jī)程序流程圖如圖8所示。
圖8 OpenCL主機(jī)程序流程圖
由于OpenCL內(nèi)存模型中,主機(jī)和設(shè)置的內(nèi)存是獨立的內(nèi)存空間。雖然在DE1SOC上,二者在一塊物理內(nèi)存上,如果通過常規(guī)的內(nèi)存分配方式分配主機(jī)內(nèi)存和設(shè)置內(nèi)存(主機(jī) malloc(),設(shè)備clCreateBuffer()),二者在應(yīng)用層面依然是獨立的,其計算模型3如圖9所示。
圖9 計算模型3
在這種情況下,完成Sobel的計算必須包括兩個部分的操作:將主機(jī)內(nèi)存的RGB數(shù)據(jù)拷貝到設(shè)備內(nèi)存中和從設(shè)備內(nèi)存中將Sobel結(jié)果讀取到主機(jī)內(nèi)存中,分析可得計算模型3計算一個Sobel特征值總運算次數(shù)如表4表2所示。
主機(jī)內(nèi)存拷貝:RGB處像素個內(nèi)存讀取和寫入,Sobel結(jié)果處的像素個內(nèi)存讀取和寫入;OpenCL內(nèi)核:像素個時鐘移位(或計算)。
表4 計算模型3的一個Sobel特征值運算
注:內(nèi)核通過獨占通道直接訪問進(jìn)行內(nèi)存讀寫,實際測量內(nèi)核計算總時間包括該部分的內(nèi)存訪問時間。
3)共享內(nèi)存實現(xiàn)。
由上述分析,對于內(nèi)存消耗型的計算,運算時間會遠(yuǎn)遠(yuǎn)低于內(nèi)存拷貝時間。因此,由于硬件的特殊結(jié)構(gòu)和運行環(huán)境的支持,使用共享內(nèi)存將能避免大量重復(fù)數(shù)據(jù)的拷貝。具體實現(xiàn)步驟如下:
Step1:主機(jī)程序調(diào)用clCreateBuffer()函數(shù)分配共享內(nèi)存,并在共享內(nèi)存中分配緩沖區(qū)。
Step2:主機(jī)程序調(diào)用clEnqueueMapBuffer()函數(shù)對上面定義的緩沖區(qū)進(jìn)行映射操作。
Step3:主機(jī)程序填充或更新共享內(nèi)存緩沖區(qū)的內(nèi)容。
Step4:主機(jī)將相應(yīng)內(nèi)核函數(shù)放入命令隊列,然后調(diào)用clSetKernelArg()函數(shù)將共享內(nèi)存緩沖區(qū)傳遞給內(nèi)核函數(shù)。
Step5:OpenCL加速子系統(tǒng)處理緩沖區(qū)數(shù)據(jù)。
其OpenCL共享內(nèi)存計算模型如圖10所示,主要操作為將RGB數(shù)據(jù)存放在分配好的主機(jī)和設(shè)備的共享內(nèi)存,將Sobel結(jié)果也存放在主機(jī)和設(shè)備的共享內(nèi)存,不存在主機(jī)和設(shè)備間數(shù)據(jù)拷貝操作,分析可得計算模型3計算一個Sobel特征值總運算次數(shù)如表5表2所示。
圖10 計算模型4
內(nèi)存拷貝OpenCL內(nèi)核Gray9Sobel1合計10僅9個像素時鐘來操作移位寄存器
系統(tǒng)開發(fā)PC主機(jī)系統(tǒng)為Windows10,64位,安裝Quartus II 16.1和Intel OpenCL SDK 16.1。Quartus II軟件編譯硬件邏輯,OpenCL SDK編譯OpenCL內(nèi)核。Intel OpenCL SDK在編譯內(nèi)核時會調(diào)用Quartus II的FPGA工具來生成相應(yīng)的邏輯資源,對內(nèi)核系統(tǒng)的修改也能通過Quartus II的Qsys工具來編輯。
在友晶科技官方提供的OpenCL支持包中,有已經(jīng)編譯好的包含OpenCL運行環(huán)境的Linux SD卡鏡像,將鏡像寫入空白SD卡中即可運行OpenCL環(huán)境。在DE1-SoC上運行Linux系統(tǒng),配置ARM交叉編譯工具編譯OpenCL主機(jī)程序的可執(zhí)行文件,將已經(jīng)編譯好的驅(qū)動和OpenCL運行環(huán)境拷貝到SD的Linux文件系統(tǒng)目錄中,配置環(huán)境變量。再將OpenCL編譯過程中生成的aocx配置文件拷貝到DE1-SOC Linux文件系統(tǒng)中,執(zhí)行aocl program sobel.aocx命令來配置硬件,以實現(xiàn)FPGA中內(nèi)核邏輯的更新。
最后在終端中執(zhí)行OpenCL主機(jī)程序,對不同方案進(jìn)行測試。
圖11 實驗平臺
實驗測試平臺如圖11所示,DE1-SoC通過VGA接口連接顯示器,實時顯示數(shù)據(jù)處理結(jié)果,如圖12所示為1 920*1 080像素大小圖片進(jìn)行Sobel邊緣檢測后的結(jié)果。
表1 不同分辨率圖像采用C與OpenCL不同模式處理時間對比表
圖12 實驗結(jié)果樣圖
為分析采用OpenCL與FPGA模式進(jìn)行Sobel算法完成邊緣檢測的性能優(yōu)勢,測試了OpenCL和片上ARM軟件處理,對不同分辨率的圖像進(jìn)行顏色空間轉(zhuǎn)換的時間進(jìn)行比較。其中,OpenCL與FPGA模式下測試了OpenCL和OpenCL采用共享內(nèi)存的兩種方式;ARM軟件處理模式下測試了圖像輸入數(shù)據(jù)沒有采用數(shù)據(jù)緩沖區(qū)和采用數(shù)據(jù)緩沖區(qū)兩種方式;圖像數(shù)據(jù)為SD卡存儲的bmp格式圖像,圖像分辨率為320*240、640*480、1 280*720和1 920*1 080。通過實驗測試,表1為4種不同分辨率圖像數(shù)據(jù)采用不同模式的OpenCL和軟件執(zhí)行時間。對于計算模型1,通過時間戳測量所有像素點依次完成灰度轉(zhuǎn)換到Sobel灰度值完成運算的總時間;對于計算模型2,測量從將所有像素依次完成灰度轉(zhuǎn)換后放入緩沖區(qū),到緩沖區(qū)像素點灰度值完成Sobel運算的時間;對于模型3,測量主機(jī)像素數(shù)據(jù)拷貝到設(shè)備、OpenCL內(nèi)核從開始執(zhí)行到結(jié)束和將Sobel運算結(jié)果從設(shè)備拷貝到主機(jī)的總時間;對于模型4,僅測量OpenCL內(nèi)核從開始執(zhí)行到結(jié)束時間,像素數(shù)據(jù)和Sobel運算結(jié)果的在共享內(nèi)存中讀寫時間總時間。
從實驗數(shù)據(jù)來看,OpenCL非共享內(nèi)存計算性能是無緩沖區(qū)的軟件處理的4~6倍,是由緩存區(qū)的軟件處理的2~3倍。在OpenCL非共享內(nèi)存計算中,主機(jī)內(nèi)存拷貝的時間是設(shè)備內(nèi)核執(zhí)行時間的17~19倍。
OpenCL共享內(nèi)存的計算方式較非共享內(nèi)存方式,性能提高約20倍;較帶緩存區(qū)的軟件處理性能提升約50倍;較不帶緩存區(qū)的軟件處理性能提高約100倍。
已知HPS內(nèi)Cortex-A9的運行頻率為900 Mhz,Quartus II編譯報告給出的內(nèi)核運行頻率為129 Mhz。因此,OpenCL的共享內(nèi)存方式較帶緩存的軟件處理方式,在Sobel計算的每赫茲性能提升約340倍。
本文提出一種OpenCL與FPGA異構(gòu)模式進(jìn)行Sobel邊緣檢測算法的并行性方案,在DE1SOC硬件平臺上完成了OpenCL加速功能。實驗結(jié)果表明,OpenCL與FPGA異構(gòu)模式并行性運算方式,與ARM處理的軟件在相同算法上有很大性能提升。OpenCL與FPGA異構(gòu)模式與傳統(tǒng)硬件平臺相比,提高了系統(tǒng)執(zhí)行效率。綜合上述實驗和結(jié)論, OpenCL與FPGA模式在實時圖像處理領(lǐng)域有很大應(yīng)用價值。
[1] Meng X, Chaudhary V. A High-Performance Heterogeneous Computing Platform for Biological Sequence Analysis[J]. IEEE Transactions on Parallel & Distributed Systems, 2010, 21(9):1267-1280.
[2] Plaks T P. Proceedings of the International Conference on Engineering of Reconfigurable Systems and Algorithms, June 23 - 26, 2003, Las Vegas, Nevada, USA[J]. Thorax, 2003, 45(11):907-907.
[3] 袁春蘭,熊宗龍,周雪花,等.基于Sobel算子的圖像邊緣檢測研究[J].激光與紅外,2009,39(1): 85-87.
[4] 何春華,張雪飛,胡迎春. 基于改進(jìn)Sobel算子的邊緣檢測算法的研究[J]. 光學(xué)技術(shù),2012,38(3): 323-327
[5] 鄧仰東,朱茂華,劉春峰. 異構(gòu)處理器OpenCL編程導(dǎo)論[M]. 北京: 機(jī)械工業(yè)出版社, 2016: 120.
[6] (美)Raymod Tay,OpenCL異構(gòu)并行編程實踐[M]. 張立浩譯. 北京: 機(jī)械工業(yè)出版社, 2015.
[7] 黃樂天. FPGA異構(gòu)計算:基于OpenCL的開發(fā)方法[M]. 西安: 西安電子科技大學(xué)出版社, 2016.
[8] 徐 波. Altera Cyclone V的Linux系統(tǒng)的搭建[J]. 科技資訊,2014(34): 15-15.
[9] 徐 家,陳 奇. 基于V4L2 的視頻設(shè)備驅(qū)動開發(fā)[J]. 計算機(jī)工程與設(shè)計, 2010, 31(16): 3569-3572.
[10] 雷 洪,熊文龍. 基于 Frambuffer 的 LCD 驅(qū)動程序的實現(xiàn)[J]. 武漢理工大學(xué)學(xué)報: 交通科學(xué)與工程版, 2006, 30(1): 106-109.
[11] 宋寶華. Linux設(shè)備驅(qū)動開發(fā)詳解:基于最新的Linux 4.0內(nèi)核[M]. 北京: 機(jī)械工業(yè)出版社, 2016.
[12] 范興山,彭 軍,黃樂天. 基于OpenCL的FPGA設(shè)計優(yōu)化方法研究[J]. 電子技術(shù)應(yīng)用,2014,40(01):16-19.
[13] 詹 云,趙新燦,譚同德. 基于OpenCL的異構(gòu)系統(tǒng)并行編程[J]. 計算機(jī)工程與設(shè)計,2012,33(11):4191-4195,4293.
[14] Intel? Cyclone? V SoC Development Kit Reference Platform Porting Guide. Version 17.0[EB/OL]. https://www.altera.com
[15] Intel? FPGA SDK for OpenCL Getting Started Guide. Version 17.0[EB/OL]. https://www.altera.com.