李 威,梁 軍,張 楨,李 青
(1.北京聯(lián)合大學 北京市信息服務工程重點實驗室,北京 100101; 2.北京聯(lián)合大學 機器人學院,北京 100027)
合成孔徑雷達(Synthetic Aperture Radar,SAR)是一種全天候、全天時的高分辨率微波遙感成像雷達,廣泛應用于地球遙感、海洋研究、資源勘探和災情預報等領域[1]。近幾年由于無人機技術的快速發(fā)展,機載SAR成為測繪困難地區(qū)實現(xiàn)全天候、全天時快速成像的主要遙感手段[2-4]。然而,SAR采集的原始數據量相當龐大,若將數據直接傳輸再由主機端進行處理,則對于設備的傳輸速度要求過高,因此機載SAR的實時處理至關重要[5-6]。同時,由于機載SAR計算資源有限,分析過程可能需要大量時間,因此降低了無人機對外界環(huán)境的響應能力[7]。
為權衡無人機的性能和功耗問題,對嵌入式機載設備提出了更高要求,雖然利用專用芯片、現(xiàn)場可編程門陣列(Field Programmable Gate Array,FPGA)、數字信號處理(Digital Signal Processing,DSP)等專用硬件的性能優(yōu)化方案具有較大優(yōu)勢,但研發(fā)成本也很高。通過移動ARM GPU對通用計算進行加速是近幾年在嵌入式平臺新興的優(yōu)化方案,能夠降低額外的硬件成本與功耗,且通用性和可移植性強[8],此外,在并行加速計算中具有較大的性能優(yōu)勢,可提供高于CPU數十倍甚至數百倍的計算性能[9]。但由于嵌入式ARM GPU硬件資源的限制,導致目前傳統(tǒng)GPU平臺上的優(yōu)化方法無法應用于嵌入式ARM GPU,因此其意味著需要投入更多專門的工作來進行嵌入式ARM GPU優(yōu)化??梢?嵌入式ARM GPU優(yōu)化研究具有重要意義。
目前,研究人員對于機載SAR已開展了大量的研究工作。文獻[10]通過GPU對無人機SAR成像的性能進行加速。文獻[11]在具有GPU和CPU的異構平臺上設計并實現(xiàn)機載SAR處理系統(tǒng)。文獻[12]提出基于圖像的新GPU光線跟蹤方法進行單靜態(tài)SAR雙反射仿真。文獻[13]設計異構CPU-GPU框架,解決了無人機拍攝的高清視頻檢測成本過高問題。文獻[14]通過GPU并行加速來提高SAR成像目標檢測效率。文獻[15]在多個GPU平臺上通過反投影進行多通道SAR處理。文獻[16]在配備Tegra K1的片上系統(tǒng)上進行完全聚焦SAR算法并行優(yōu)化以實現(xiàn)算法實時處理。然而,國內外關于SAR并行算法的通用性研究較少,由于不同硬件平臺需對算法進行針對性優(yōu)化及改進,因此會增加軟件算法人員的工作量和移植難度。本文在ARM Mali-T860 GPU異構計算平臺上,提出基于OpenCL的多視處理算法、旋轉放縮算法和圖像量化算法的并行優(yōu)化策略,以提升SAR算法整體性能。
Mali-T860是一款由ARM公司研發(fā)設計的Midgard架構的最高性能GPU,如圖1所示。該GPU可擴展至16個連通著色器核心(Shader Core,SC)。在每個核心中包含2個算術流水線、1個數據讀寫流水線和1個紋理流水線。每個算術流水線是基于單指令多數據(Single Instruction Multiple Data,SIMD),指令可同時對多個數據元素進行操作。數據讀寫流水線對RAM進行讀寫操作,紋理流水線負責所有與紋理相關的內存訪問。Mali Midgard GPU中的算術管道基于SIMD樣式矢量化,指令可同時對多個數據元素進行操作[17]。
圖1 ARM Mali-T860 GPU架構Fig.1 ARM Mali-T860 GPU architecture
多視處理是早期對SAR圖像相干斑進行處理的技術[18]。本文采用的多視處理技術對合成孔徑的多普勒帶寬進行分割,孔徑被分割后各自成像(出現(xiàn)多視),然后將疊加后的各子視圖進行平均處理[19]。但是,多視處理技術的前提是每一個子視圖必須觀測相同的地物,幾乎是同時且沒有輻射失真,還需要使用相同的極化方式和頻率。
根據多視參數(scale)將圖像按行和列取均值輸出,例如scale=4,其中scale需選取2~16中的偶數,因此本文選取4和16作為scale的值。如圖2所示,圖像按行x和列y每4個像素取均值輸出為1個像素F(x′,y′),圖像整體縮小為原圖像的1/16,如式(1)~式(3)所示:
圖2 scale為4和16時的多視處理 Fig.2 Multi-view processing with scales of 4 and 16
x′=x÷scale
(1)
y′=y÷scale
(2)
(3)
多視處理算法中每個結果數據都需要訪存scale×scale個數據并進行均值計算,數據和數據之間不存在依賴關系,具有良好的并行性。但該算法在讀取不同行數據時,無法保證數據地址的連續(xù)性,這是導致算法性能下降的原因之一,其優(yōu)化重點為提高訪存帶寬的利用率。
旋轉放縮作為圖像幾何變換中最復雜的操作,廣泛應用于軍事、航空、生物醫(yī)學等領域[20]。由于在圖像旋轉放縮的過程中需要使用浮點運算,原始圖像為整數像素坐標(x,y),變換為目標圖像的位置坐標并非整數,反之亦然。因此,圖像旋轉變換包括坐標的幾何運算和對運算結果的插值處理兩方面,并且根據選擇的插值方法不同,得到的旋轉效果也不同。
輸入算法所需參數輸出矩陣的行Orow、列Ocol、角度a和放縮比例s,計算原圖像中心位置(xmid,ymid)與輸出圖像中心位置(xoutMid,youtMid),如式(4)~式(7)所示:
(4)
(5)
(6)
(7)
在圖像放縮過程中,首先計算旋轉角度后對應到原圖位置,坐標轉換以放縮后的圖像中心為原點,如式(8)和式(9)所示。其次計算旋轉前坐標,獲取4個角點坐標,如式(10)所示。最后進行雙線性插值計算,如式(11)~式(17)所示:
x′i=(yi÷s-youtMid)×sina+
(xi÷s-xoutMid)×sina+xmid(i=0,1,…,n)
(8)
y′i=(yi÷s-youtMid)×cosa+
(yi÷s-youtMid)×cosa+ymid(i=0,1,…,n)
(9)
x1=?x′」,x2=「x′?,y1=?y′」,y2=「y′?
(10)
Q11=(x1,y1)
(11)
Q12=(x1,y2)
(12)
Q21=(x2,y1)
(13)
Q22=(x2,y2)
(14)
(15)
(16)
(17)
旋轉放縮算法需要計算每個圖片像素處理前后的坐標位置F(x,y),所有像素坐標計算并不存在數據依賴關系,具有較好的并行度,但每個像素都存在密集計算,并且該算法在雙線性插值計算中存在較多的條件分支,其優(yōu)化重點為簡化計算及對條件分支的優(yōu)化。
圖像量化是圖像處理領域的一項基本技術,其可以在保證圖像顏色失真度較小的前提下,將含有豐富顏色信息的圖像用少數的代表色進行表示[21],如圖3所示。圖像量化等級(coef)多,所得圖像層次豐富,灰度分辨率高,圖像質量好,但數據量會增加;圖像量化等級少,圖像層次欠豐富,灰度分辨率低,會出現(xiàn)假輪廓現(xiàn)象,圖像質量變差,但數據量會降低。
圖3 圖像量化過程Fig.3 Image quantization process
在圖像量化過程中,需要求矩陣的行均值Rmean、列均值Cmean、全均值M以及結果像素F(x,y),如式(18)~式(21)所示:
(18)
(19)
(20)
F(x,y)=M×coef÷Rmean(x)÷Cmean(y)
(21)
圖像量化算法是典型的訪存密集型算法,算法執(zhí)行過程中需要計算行均值、列均值以及全均值,至少需要對所有像素訪存兩次,并且結果矩陣的運算也需要對所有像素進行一次訪存,這將極大增加算法執(zhí)行時間。該算法優(yōu)化重點為提高訪存效率并減少重復數據訪存。
ARMMali-T860 GPU基于SIMD設計,即將數據以向量形式存儲,再通過一條指令對整個向量進行運算。該GPU寄存器為128位的向量化設計,每執(zhí)行1次SIMD向量操作,相當于連續(xù)4次float/integer或2次double操作。向量化效果基本與并行化效果相一致,且理論上性能是普通標量運算的4倍,提高了訪存帶寬利用率。
旋轉放縮算法是典型的計算密集型算法,由于該算法的每個數據都需要反復計算輸入和輸出圖像的中心坐標、旋轉角度的正弦值和余弦值等參數,而且這些參數由初始輸入決定,因此優(yōu)化策略將這些參數由CPU進行計算,再以常量參數輸入GPU,以此簡化并行算法中各線程的流水線計算。
在雙線插值計算中存在的4條分支會導致線程間負載不均衡。算術邏輯單元(Arithmetic and Logic Unit,ALU)支持4次mul操作和3次add操作的點積計算,計算周期為7 FLOPS,因此將雙線插值計算轉換成2階矩陣點積,通過條件分支將不符合條件的參數置0,在保證結果正確的情況下實現(xiàn)所有線程的負載均衡,具體公式如式(22)~式(27)所示:
(22)
(23)
v0=(x2-x′,x′-x1)
(24)
v1=((y2-y′)×v0,(y2-y′)×v0)
(25)
v2=(t1,t2)
廣東省藥品檢驗所堅持“為藥品標準做方法,為藥品監(jiān)督做方法”,不斷提升食品藥品檢測能力和水平,把食品藥品質量風險關進防控籠子里,書寫“最嚴謹標準”的“廣東樣本”。
(26)
(27)
旋轉放縮算法中存在較多的條件判斷語句,這些條件判斷語句主要是為了區(qū)分不同元素在雙線性插值中的運算。由于不同的分支運算存在差異,將導致線程間的負載不均衡,因此為減少條件分支,使用A=B?C:D語句代替if…else…語句是減少動態(tài)指令的主要方式。
SIMD向量操作對于數據對齊有較高的要求,因此首先考慮col均值運算,通過一次讀入4個行元素提高訪存效率,再基于線程并行折半求和,最終計算得出當前列的平均值。
row均值計算采用for循環(huán)逐個累加所得保證線程連續(xù)尋址,但是每個work_group中僅有一個線程,因此如何在開啟大量線程的同時滿足線程的連續(xù)尋址是row歸約提升性能的關鍵。通過增加work_group線程數以提升整體處理性能,這樣雖然會導致不同線程的跨步尋址問題,但是能保證每個線程連續(xù)尋址。如圖4所示,以4 096×4 096的矩陣規(guī)模為輸入,每個work_group開啟64個線程,每個線程負責累加64個數據,然后輸出64×4 096的臨時矩陣,最后在計算所有元素的均值步驟中得出列均值。實驗結果表明,row規(guī)約優(yōu)化對于計算所有元素均值的kernel增加了0.8 ms~0.9 ms的時間開銷,但對于計算列均值的kernel減少了5 ms的時間開銷。
圖4 row mean規(guī)約優(yōu)化Fig.4 row mean reduction optimization
由于col與row均值的求解過程中存在一定的數據重復,如求解col與row均值的kernel需要讀取當前行的值,因此將col與row歸約的兩個kernel合并為一個kernel。單個線程每次讀入的4個行元素可用于求解當前col均值,同時用于累加以求出row均值的4個行元素。以數據規(guī)模為4 096×4 096為例,得出64×4 096的預處理矩陣,4 096×1的row均值矩陣。求解全均值的kernel進一步計算預處理矩陣得出col均值矩陣,如圖5所示。
圖5 col mean和row mean的kernel合并Fig.5 Kernel merge of col mean and row mean
kernel合并后每個線程一次讀取4個數據,即每個work_group一次讀取64個數據(每個work_group開啟16個線程)。在此基礎上,為進一步提高帶寬利用率,每個線程執(zhí)行兩次讀取,即每個work_group一次讀取128個數據,如圖6所示。
圖6 訪存優(yōu)化Fig.6 Memory access optimization
本文選擇ARM Mali-T860 GPU平臺和Cortex-A53(1.8 GHz) CPU平臺,ARM Mali-T860 GPU性能配置如表1所示。
表1 ARM Mali-T860 GPU性能配置Table 1 Performance configuration of ARM Mali-T860 GPU
本文設定數據規(guī)模為512×512~4 096×4 096,通過優(yōu)化算法的加速比衡量計算性能提升效果,確保測試精度。
4.2.1 多視處理算法性能分析
如圖7所示,na?ve為多視處理算法的GPU初始版本,向量化表示經過向量化處理的多視處理算法,scale=4時多視處理算法優(yōu)化后取得了45倍~62倍的性能提升。可以看出,隨著數據規(guī)模的增大,加速比不斷減小,算法優(yōu)化效果有所下降,主要原因為開啟的線程資源大于實際硬件的線程數,所有任務必須通過線程的上下文切換實現(xiàn),但上下文切換的過程中存在數據延時情況。
圖7 多視處理算法優(yōu)化效果(scale=4)Fig.7 Optimization effect of multi-view processing algorithm(scale=4)
如圖8所示,scale=6時多視處理算法優(yōu)化后取得了17倍~33倍的性能提升??梢钥闯?隨著數據規(guī)模的增大,算法加速比不斷增加,優(yōu)化效果越發(fā)明顯,主要原因為單個線程處理數據量的增加,即單線程流水線變長,可有效緩解多視處理算法對于線程數量的需求。
圖8 多視處理算法優(yōu)化效果(scale=16)Fig.8 Optimization effect of multi-view processing algorithm(scale=16)
4.2.2 旋轉放縮算法性能分析
如圖9所示,na?ve表示旋轉放縮算法的GPU初始版本,簡化計算& ALU、減少動態(tài)指令和減少分支分別表示經過簡化計算& ALU、減少動態(tài)指令和減少分支的旋轉放縮算法,旋轉放縮算法優(yōu)化后取得了48倍~74倍的性能提升。
圖9 旋轉放縮算法優(yōu)化效果(a=30°、s=1.5)Fig.9 Optimization effect of rotation scaling algorithm (a=30°、s=1.5)
可以看出,在數據規(guī)模為1 024×1 024和512×512時,加速比基本相同,隨著數據規(guī)模的進一步增加,算法優(yōu)化效果有所下降,其主要影響因素為:1)旋轉放縮算法是計算密集型算法,具有較好的并行性,kernel執(zhí)行時間由單線程執(zhí)行時間決定;2)Mali-T860 GPU平臺線程數量有限,若開啟線程數超過硬件本身,則需要通過上下文切換來完成所有任務。同時,筆者對旋轉放縮算法進行SIMD向量操作,但算法性能仍有所下降,其主要原因為每個線程處理單個數據的運算流水線已經滿載,向量化操作會進一步增加計算量。
4.2.3 圖像量化算法性能分析
如圖10所示,na?ve表示圖像量化算法的GPU初始版本,row歸約優(yōu)化、kernel合并和訪存優(yōu)化分別表示經過row歸約優(yōu)化、kernel合并和訪存優(yōu)化的圖像量化算法,圖像量化算法優(yōu)化后取得了31倍~33倍的性能提升。
圖10 圖像量化算法優(yōu)化效果(coef=35)Fig.10 Optimization effect of image quantization algorithm (coef=35)
可以看出,在數量規(guī)模為512×512和1 024×1 024時,row歸約優(yōu)化的加速比相比na?ve有所下降,但隨著數據規(guī)模的增加,row歸約優(yōu)化的加速效果越發(fā)明顯,其主要因素為:1)在row歸約優(yōu)化后,row均值kernel會生成一個臨時矩陣,需要在全均值kernel中做進一步計算,這就造成了一部分額外訪存開銷;2)隨著數據規(guī)模的增大,線程計算量不斷增加,線程計算開銷隱藏了訪存延遲。數據規(guī)模為4 096×4 096時的圖像量化算法計算時間消耗如表2所示。
表2 圖像量化算法計算時間消耗(數據規(guī)模為4 096×4 096)Table 2 Computing time consumption of image quantization algorithm(data size is 4 096×4 096)
如圖11所示,分別將本文算法在NVIDIA Tegra X2(TX2)和AMD RyzenTMEmbedded V1000(APU)上進行實現(xiàn),可以看出算法優(yōu)化效果為:APU>TX2>Mali-T860,但各平臺運行程序時的功耗為:APU>TX2>Mali-T860(如表3所示),因此綜合考慮該性能差距為可接受。TX2的旋轉放縮算法性能遠低于其他平臺,其主要原因為TX2硬件不支持點積計算,通過軟件實現(xiàn)的點積操作不能達到性能提升的效果。
圖11 不同嵌入式異構GPU平臺上的算法優(yōu)化效果(數據規(guī)模4 096×4 096)Fig.11 Algorithm optimization effect on different embedded heterogeneous GPU platforms(data size is 4 096×4 096)
嵌入式異構平臺執(zhí)行程序功耗/WMali-T8603.6TX26.8APU30.0
傳統(tǒng)ARM嵌入式平臺的CPU無法滿足機載SAR的計算需求,因此ARM CPU+GPU的嵌入式異構多核平臺應運而生。本文充分利用嵌入式ARM Mali-T860 GPU平臺的計算能力,通過對機載SAR成像處理中的多視處理、旋轉放縮和圖像量化算法設計并行優(yōu)化策略實現(xiàn)算法加速。實驗結果表明,與基于CPU的SAR成像算法相比,基于ARM Mali-T860 GPU優(yōu)化后的多視處理、旋轉放縮和圖像量化算法整體性能更好。后續(xù)將考慮在NVIDIA Tegra X2和AMD RyzenTMEmbedded V1000平臺上對機載SAR成像過程中的多視處理、旋轉放縮和圖像量化算法做進一步性能優(yōu)化,更好地權衡SAR算法的性能和功耗問題。