李浩 戴志濤
摘要:隨著信息社會(huì)的迅猛發(fā)展,傳統(tǒng)的單核處理器及同構(gòu)多核已難以滿足大數(shù)據(jù)處理的高性能需求,采用ARM和FPGA構(gòu)建異構(gòu)多核系統(tǒng),以FPGA上的IP核作為硬件加速器,ARM提供通用計(jì)算成了高性能計(jì)算領(lǐng)域的重要發(fā)展趨勢(shì)。本文針對(duì)當(dāng)前應(yīng)用最廣泛的H.264視頻編碼算法,構(gòu)建了ARM-FPGA異構(gòu)多核系統(tǒng),提出了基于共享內(nèi)存和AXI總線的高帶寬通信方法。將編碼算法中耗時(shí)較多的模塊負(fù)載到FPGA上運(yùn)行,利用FPGA豐富的邏輯資源和并行性加速編碼,移植嵌入式Linux到ARM上并開(kāi)發(fā)相關(guān)驅(qū)動(dòng),實(shí)驗(yàn)數(shù)據(jù)表明H.264編碼算法在ARM-FPGA異構(gòu)多核系統(tǒng)中效果較好,編碼速度明顯加快,且有很好的擴(kuò)展性和靈活性。
關(guān)鍵詞:視頻編碼;異構(gòu)多核;FPGA;H.264
中圖分類號(hào):TP37
文獻(xiàn)標(biāo)識(shí)碼:A
0 引言
隨著科學(xué)技術(shù)的創(chuàng)新,云計(jì)算和移動(dòng)互聯(lián)網(wǎng)的迅猛發(fā)展使得各領(lǐng)域?qū)A繑?shù)據(jù)的處理能力要求越來(lái)越迫切。傳統(tǒng)的單核處理器已滿足不了當(dāng)下的計(jì)算要求,為此,人們提出了多核處理器解決方案。多核處理器共有兩種架構(gòu),同構(gòu)多核架構(gòu)(Homogeneous MPSoc)和異構(gòu)多核架構(gòu)(Heterogeneous)。同構(gòu)多核系統(tǒng)由功能相近的處理器構(gòu)成,如Intel系列,ARM Cortex-A9系列。異構(gòu)多核系統(tǒng)是由功能相異的處理器構(gòu)成,如IBM的Cell處理器,AMD的APU等。H.264是由ISO/IEC與ITUT合作成立的聯(lián)合視頻專家組(JVT:Joint Video Team)于2003年制定的視頻編解碼標(biāo)準(zhǔn),其主要包括視頻編碼層(VCL:Video Coding Layer)和網(wǎng)絡(luò)適應(yīng)層(NAL:Network Adaptation Layer)。
紀(jì)芳提出了一種基于FPGA同構(gòu)多核處理器的AVS視頻編碼算法實(shí)現(xiàn)方案,使用Xilinx官方提供的MicroBlaze軟核構(gòu)建同構(gòu)多核系統(tǒng),其中一個(gè)軟核作為主核,負(fù)責(zé)線程調(diào)度任務(wù)和任務(wù)分配,剩余的軟核作為協(xié)處理器負(fù)責(zé)執(zhí)行具體某些編碼算法模塊。優(yōu)點(diǎn)是充分利用了FPGA邏輯資源豐富的特點(diǎn),適合運(yùn)行并行算法,缺點(diǎn)是系統(tǒng)的流程控制和數(shù)據(jù)運(yùn)算都由FPGA實(shí)現(xiàn),硬件描述語(yǔ)言開(kāi)發(fā)難度大。
江輝提出了一種基于CPU-GPU的異構(gòu)多核架構(gòu)的H.264編碼算法實(shí)現(xiàn)方案,在該架構(gòu)中GPU作為CPU的協(xié)處理器,CPU串行執(zhí)行任務(wù),而GPU并行執(zhí)行CPU分配的任務(wù)。CPU和GPU各自有自己的專用的存儲(chǔ)器以及數(shù)據(jù)訪問(wèn)通路,因此相較于同構(gòu)多核處理器有更大的存儲(chǔ)器帶寬和計(jì)算性能,缺點(diǎn)是GPU開(kāi)發(fā)使用的CUDA是設(shè)備相關(guān)的,可擴(kuò)展性較差。
本文在前人研究基礎(chǔ)上,結(jié)合Zynq開(kāi)發(fā)板單芯片集成了雙核ARM和FPGA的特點(diǎn),提出了一種基于ARM-FPGA的異構(gòu)多核高性能架構(gòu),設(shè)計(jì)了一種異構(gòu)多核間高帶寬通信方式,移植了嵌入式Linux并開(kāi)發(fā)相關(guān)軟核的驅(qū)動(dòng),在該架構(gòu)實(shí)現(xiàn)了優(yōu)化后的H.264編碼算法,實(shí)驗(yàn)數(shù)據(jù)表明,該架構(gòu)下的算法相比同構(gòu)多核架構(gòu)具有很大性能的提升。
1 基于Zynq的異構(gòu)多核系統(tǒng)總體設(shè)計(jì)
1.1異構(gòu)多核系統(tǒng)的硬件架構(gòu)設(shè)計(jì)
本文使用的硬件平臺(tái)是Xilinx Zynq-7000 SOC,在單芯片集成了具有豐富特點(diǎn)的雙核ARM Cortex-A9處理器的處理系統(tǒng)和Xilinx可編程邏輯,整個(gè)異構(gòu)多核系統(tǒng)的硬件架構(gòu)設(shè)計(jì)如圖1所示。
處理系統(tǒng)不僅包括ARM Cortex-A9雙核處理器,還包括Cache,DDR控制器,DMA控制器等??删幊踢壿嫴捎肵ilinx 7系列的FPGA技術(shù),它包含大量不同類型的資源,主要包括塊存儲(chǔ)器(Block RAM),時(shí)鐘管理單元(Clock Management Tiles),可配置邏輯塊(Configurable Logic Block)等。ARM Cortex-A9雙核處理器和Xilinx7系列FPGA集成到單芯片中構(gòu)成了本文所介紹的異構(gòu)多核處理器系統(tǒng)。由于Zynq既有通用處理器的靈活性和可擴(kuò)展性,又有具有可編程邏輯處理器的高性能,可重構(gòu)性,因此本文在此硬件平臺(tái)上構(gòu)建了異構(gòu)多核的處理器系統(tǒng),完成了H.264編碼算法在異構(gòu)多核系統(tǒng)上的優(yōu)化實(shí)現(xiàn)。
1.2異構(gòu)多核系統(tǒng)的軟件架構(gòu)設(shè)計(jì)
為了在異構(gòu)多核系統(tǒng)上運(yùn)行H.264編碼算法,本文將嵌入式Linux系統(tǒng)移植到Zynq開(kāi)發(fā)板,并開(kāi)發(fā)相關(guān)驅(qū)動(dòng)。在Zynq異構(gòu)多核硬件系統(tǒng)上移植Linux系統(tǒng)的步驟如圖2所示。
在異構(gòu)多核硬件系統(tǒng)搭建完畢及嵌入式Linux移植完成后,本文將在軟件層實(shí)現(xiàn)H.264編碼算法。
如圖3所示,運(yùn)行過(guò)程中以下文詳述的ARM-FPGA高速通信方法及FPGA硬件加速算法的調(diào)用為基礎(chǔ),將編碼算法中耗時(shí)最多的任務(wù)負(fù)載到FPGA中去執(zhí)行,編碼算法運(yùn)行時(shí)其他階段仍在ARM中執(zhí)行。ARM將待處理數(shù)據(jù)通過(guò)AXI HP高速通信接口傳遞給FPGA,F(xiàn)PGA運(yùn)算完成后同樣通過(guò)AXI HP接口返回給ARM。
2 異構(gòu)多核系統(tǒng)間通信方法的設(shè)計(jì)與實(shí)現(xiàn)
Zynq由于將不同工藝的異構(gòu)多核融合在一個(gè)芯片,如何保證Cortex-A9和FPGA之間的互聯(lián)數(shù)據(jù)通路高速穩(wěn)定,是基于Zynq芯片設(shè)計(jì)的重點(diǎn)。Zynq中異構(gòu)核間的通信接口共有9個(gè),主要如下類型:
AXI ACP接口:ARM多核架構(gòu)下定義的一種接口,加速器一致性端口用來(lái)處理DMA之類不帶緩存的AXI外設(shè),Ps端是Slave接口。
AXI HP接口:高性能,高帶寬的AX13.0標(biāo)準(zhǔn)的接口,共有4個(gè),PL模塊作為主設(shè)備連接。
AXI GP接口:通用AXI接口,共有4個(gè),主要用于對(duì)外設(shè)端口進(jìn)行配置,是低速端口。
異構(gòu)多核通信的主要思想是共享內(nèi)存,因此本文主要設(shè)計(jì)了基于AXI GP接口的低速通信方法和基于AXI HP接口的高速通信方法,確保PL和PS數(shù)據(jù)交互通路高效傳輸。
AXI HP的功能和表1中的寄存器相關(guān),本文設(shè)計(jì)并實(shí)現(xiàn)了高速通道接口在Linux下的驅(qū)動(dòng)程序,主要是通過(guò)這些寄存器來(lái)配置AXI HP接口。
2.1異構(gòu)多核系統(tǒng)的軟件架構(gòu)設(shè)計(jì)
Zynq平臺(tái)一共提供了四個(gè)AXI HP接口,每個(gè)接口都有兩個(gè)FIFO緩沖器,一個(gè)是讀緩沖,一個(gè)是寫(xiě)緩沖。由于AXI_HP接口用于高速通信,因此使用AXI3.0通信協(xié)議,ARM核可直接接訪問(wèn)DDR內(nèi)存,而FPGA通過(guò)AXI_HP接口訪問(wèn)DDR內(nèi)存和片上存儲(chǔ)器OCM,異構(gòu)多核通過(guò)AXI_HP接口使用共享內(nèi)存的方式進(jìn)行通信,具體的數(shù)據(jù)傳輸方式是通過(guò)DMA實(shí)現(xiàn)的。AXI_HP接口是為了PL訪問(wèn)PS上的存儲(chǔ)器(DDR和On-Chip RAM)而專門(mén)設(shè)計(jì)的高速數(shù)據(jù)通路,因此它支持標(biāo)準(zhǔn)的AXI_3.0接口,可以跨PS和PL的AXI接口之間的異步時(shí)鐘域,可編程的32位/64位數(shù)據(jù)寬度。AXI_HP端口分成兩部分,一部分和PL直接連接,另一部分連接到AXI_Interconnect,從而訪問(wèn)DDR和OCM。
AXI_HP端口用于PS和PL部分的高速數(shù)據(jù)交互,其數(shù)據(jù)搬移一般通過(guò)邏輯內(nèi)的DMA控制器而不需要CPU參與,因此本文用異構(gòu)多核處理器運(yùn)行H.264編碼算法時(shí)數(shù)據(jù)的傳輸便是通過(guò)AXI_HP接口傳輸?shù)紻DR中,供CPU和FPGA完成進(jìn)一步的圖像處理。
2.2異構(gòu)多核系統(tǒng)的軟件架構(gòu)設(shè)計(jì)
Zynq平臺(tái)一共提供了4個(gè)AXI_GP接口,兩個(gè)主接口以及兩個(gè)從接口,基于AXI_GP接口的低速通信流程如圖4所示。異構(gòu)核間ARM核作為主設(shè)備,F(xiàn)PGA作為從設(shè)備,ARM核與FPGA核間通信主要通過(guò)ARM核對(duì)從設(shè)備的端口寄存器讀寫(xiě)來(lái)實(shí)現(xiàn)。本文設(shè)計(jì)并實(shí)現(xiàn)了FPGA中的自定義IP核在Linux下的驅(qū)動(dòng)程序,具體實(shí)現(xiàn)了AXI_IP_OPEN,AXI_IP_CLOSE,AXI_IP_READ,AXI_IP_WRITE,AXI_IP_IOCTL等函數(shù),命名及實(shí)現(xiàn)方式均符合Linux標(biāo)準(zhǔn)的驅(qū)動(dòng)程序?qū)崿F(xiàn)規(guī)范。
3 異構(gòu)多核系統(tǒng)上H.264編碼算法的實(shí)現(xiàn)
3.1H.264視頻編碼算法
目前主流的H.264視頻編碼標(biāo)準(zhǔn)有三種:JM參考模型,T264,X264。JM參考模型是ITUT組織的一個(gè)官方的編碼參考程序,一般用于開(kāi)發(fā)者學(xué)習(xí)和比對(duì)使用,功能完善但編碼效率低。T264是中國(guó)開(kāi)源愛(ài)好者組織開(kāi)發(fā)的H.264視頻編碼程序,由于與其他解碼器兼容性不好,目前已停止更新。X.264是法國(guó)人組織開(kāi)發(fā)的H.264視頻編碼算法,目前仍有開(kāi)源社區(qū)維護(hù)該項(xiàng)目。它的兼容性好且編碼效率高,因此本文選用X264算法作為異構(gòu)多核系統(tǒng)上編碼算法的基礎(chǔ)。此外,對(duì)于視頻編碼的核心模塊,如幀內(nèi)預(yù)測(cè)、變換量化等模塊,需要大量運(yùn)算的模塊針對(duì)不同的處理器做了相適應(yīng)的指令集優(yōu)化,利用相關(guān)的多媒體擴(kuò)展指令集來(lái)改善編碼性能。我們以x264算法為原型,通過(guò)在PC機(jī)平臺(tái)上的實(shí)際測(cè)試,同時(shí)結(jié)合一些前人的工作成果,來(lái)分析總結(jié)H.264標(biāo)準(zhǔn)視頻編碼器在編碼過(guò)程中耗時(shí)過(guò)多的模塊,并根據(jù)分析結(jié)果確定相應(yīng)的軟硬件劃分方案。x264_clip_uint8是x264算法耗時(shí)最多的函數(shù),其次是hpel_filter、_abs、x264_pixel_sad_16x16、quant_4x4函數(shù)。hpel_filter函數(shù)中耗時(shí)最多的部分也為x264_clip_uint8;而abs是預(yù)測(cè)編碼中計(jì)算子塊的計(jì)算用于模式選擇依據(jù)的子塊絕對(duì)差和所必須要的函數(shù),而x264_pixel_sad_16x16則是計(jì)算16x16塊的絕對(duì)差和的函數(shù)。
3.2測(cè)試結(jié)果與分析
本文在Zynq7000開(kāi)發(fā)板上實(shí)現(xiàn)了x264編碼器算法,編碼測(cè)試了三個(gè)視頻序列分別為Bus,City,F(xiàn)ootball(CIF352x288),編譯環(huán)境是Linux下的Gcc,測(cè)試幀數(shù)為100幀。通過(guò)對(duì)比ARM-FPGA異構(gòu)多核架構(gòu)和ARM同構(gòu)多核架構(gòu)的同一幀YUV圖像統(tǒng)計(jì)信息,如表2所示,兩者編碼后圖像質(zhì)量上基本一致,但編碼時(shí)減少了30%左右。這表明本文提出的方法是有效的,相較ARM同構(gòu)多核時(shí)編碼性能有大幅的提升。
4 結(jié)論
本文針對(duì)Zynq開(kāi)發(fā)板單芯片集成雙核ARM和FPGA的特點(diǎn),提出了一種基于ARM-FPGA的異構(gòu)多核硬件架構(gòu),設(shè)計(jì)了一種異構(gòu)多核間高帶寬通信方式,移植Linux并開(kāi)發(fā)相關(guān)驅(qū)動(dòng),在該架構(gòu)實(shí)現(xiàn)了優(yōu)化后的H.264編碼算法。通過(guò)對(duì)視頻序列編碼在ARM同構(gòu)多核環(huán)境下進(jìn)行比對(duì),硬件加速效果明顯。目前最新的編碼標(biāo)準(zhǔn)是HEVC,其特點(diǎn)是復(fù)雜度高,壓縮比大,理論上適合運(yùn)行在本文介紹的異構(gòu)多核系統(tǒng)上,下一步的研究方向可致力與此。