楊千禾
(西安電子工程研究所,陜西西安 710100)
隨著電子反偵察技術(shù)的完善,雷達(dá)面臨著難以捕捉目標(biāo)、工作環(huán)境復(fù)雜、多樣化的工作模式和多功能一體化的發(fā)展模式。不論從研發(fā)角度還是從用戶需求角度都對雷達(dá)系統(tǒng)提出了越來越高的要求,雷達(dá)技術(shù)必須與時俱進(jìn)。
現(xiàn)代雷達(dá)技術(shù)發(fā)展有兩個重要方向:①合理利用能量,高效獲取信息;②快速適應(yīng)需求,有效靈活擴展。
目前大量使用的數(shù)字陣列雷達(dá)以功能為核心,導(dǎo)致雷達(dá)型號眾多,軟件與硬件關(guān)聯(lián)性強,不利于雷達(dá)升級和擴展;研制周期長、開發(fā)效率低等問題成為雷達(dá)使用性能提升瓶頸。在這種環(huán)境下,“軟件化雷達(dá)”概念孕育而生。軟件化雷達(dá)采用“以軟件技術(shù)為中心,面向需求”的開發(fā)模式,主要思路是通過雷達(dá)系統(tǒng)中軟件和硬件的解耦[1],使雷達(dá)系統(tǒng)能夠基于軟件化開發(fā)模式靈活實現(xiàn)系統(tǒng)功能定義、資源配置、模式擴展和性能提升,以不斷滿足實際需求[2]。
傳統(tǒng)雷達(dá)信號處理機使用現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)和數(shù)字信號處理器(Digi?tal Signal Processing,DSP),其計算速度雖然能夠滿足要求,在計算上也較為精確,但與FPGA 和DSP 的軟件程序復(fù)用性較低,程序調(diào)試?yán)щy。而僅使用中央處理器(Central Pro?cessing Unit,CPU)作為計算核心的信號處理機,受限于CPU 時鐘頻率和內(nèi)核數(shù)目,在處理實時數(shù)據(jù)時面臨著系統(tǒng)資源消耗過多、性能下降等問題。
為進(jìn)一步提升雷達(dá)系統(tǒng)計算能力,同時降低后續(xù)程序調(diào)試難度,實現(xiàn)雷達(dá)軟硬件解耦,增強雷達(dá)的可重構(gòu)性,本文使用圖形處理器(Graphics Processor Unit,GPU)代替DSP和FPGA 作為雷達(dá)的計算核心,組成GPU+CPU 的異構(gòu)平臺作為新型的雷達(dá)信號處理系統(tǒng)架構(gòu)。GPU 內(nèi)含統(tǒng)一計算設(shè)備體系結(jié)構(gòu)(Compute Unified Device Architecture,CU?DA),開發(fā)人員可使用C 語言對GPU 進(jìn)行編程。在CUDA下開發(fā)的軟件具有很強的可移植性,可滿足所有計算能力在GPU 上直接運行。
當(dāng)前雷達(dá)信號處理機架構(gòu)實現(xiàn)方式主要有3 種:
(1)基于專用DSP 的分布式信號處理架構(gòu)。該架構(gòu)由多個計算板卡組成,每個板卡內(nèi)含多個DSP 處理器,板卡數(shù)量和處理器數(shù)量由實際計算資源需求決定,雷達(dá)信號處理機通過板卡之間的協(xié)同計算實現(xiàn)應(yīng)用程序開發(fā)[3]。該架構(gòu)優(yōu)點是系統(tǒng)功耗低,能夠適應(yīng)不同規(guī)模的信號處理需求;缺點是軟硬件解耦能力差,單節(jié)點計算能力低,需要在系統(tǒng)數(shù)據(jù)分發(fā)、多節(jié)點同步處理和分布式實時通信方面進(jìn)行技術(shù)攻關(guān)。
(2)實現(xiàn)方式為基于多核CPU/PowerPC 的分布式信號處理架構(gòu)[4]。此架構(gòu)因為有MKL、VSPL 等計算加速開發(fā)工具包和準(zhǔn)實時的操作系統(tǒng)作支撐,所以開發(fā)人員只需完成雷達(dá)信號處理應(yīng)用層軟件的設(shè)計[5],此方式提升了軟硬件解耦能力,降低了軟件移植難度,開發(fā)效率顯著提高。主要難點是單節(jié)點計算能力不夠強大,需要在多節(jié)點間進(jìn)行數(shù)據(jù)分發(fā)、同步處理和實時通信[6]。
(3)基于CPU+GPU 的異構(gòu)處理架構(gòu)。主要優(yōu)點是超強的單節(jié)點計算能力與較低的經(jīng)濟成本,高效的軟件開發(fā)效率和支持智能化開發(fā)工具包。
相較于DSP/CPU/PowerPC 等處理器,單節(jié)點的GPU 具有更強大的浮點計算能力。單個6U VPX 結(jié)構(gòu)的GPU 刀片最高可支持的單精度浮點處理能力達(dá)6.1Tflops(Tesla P6),約等于48 片TMS320C6678 的計算量,大大減少了計算節(jié)點,降低了系統(tǒng)復(fù)雜程度,減少了處理流水延時,如表1 所示。
Table 1 Comparison of floating point processing capacity of main devices表1 主要器件浮點處理能力對比
對于大型數(shù)字陣列雷達(dá),需要同時形成多個不同指向的數(shù)字接收波束,完成對指定發(fā)射空域的覆蓋[7]。因此,需要配備計算能力強大的信號處理機。由于功耗和面積限制,1 塊6U 板卡最多支持8 片TMS320C6678 的多核DSP 處理器;或者是1 片E5-2648LV4 的CPU 處理器,單板浮點處理能力為896Gflops;亦或是最多支持4 片T4240 處理器,單板浮點處理能力為768Gflops。雖然1 塊6U 板卡只能搭載1個MXM 接口的Tesla P6 GPU,但這個板卡的計算處理能力可達(dá)6.1Tflops。
相較于DPS/FPGA 動輒十幾分鐘甚至一個小時的燒寫時間,GPU 軟件編譯僅需幾秒,程序調(diào)試幾乎支持所有的C/C++集成開發(fā)環(huán)境,擺脫了仿真器束縛,大大增加了靈活性。與CPU/PowerPC 的處理平臺相比,單節(jié)點處理能力更強,板卡數(shù)量大大減少,減少了節(jié)點之間的數(shù)據(jù)傳輸,使系統(tǒng)復(fù)雜程度降低。目前市場上的計算級GPU 以英偉達(dá)公司的板卡為主,CUDA 驅(qū)動的向下兼容和向上兼容都較穩(wěn)定,使CUDA 程序具有較好的可移植性,避免再次開發(fā)相似功能,節(jié)省了人力資源,降低了開發(fā)難度,提高了開發(fā)效率。在面對更大計算需求時可以靈活擴展或升級GPU 卡。
近年機器學(xué)習(xí)的興起對高性能計算需求越來越大。GPU 作為目前機器學(xué)習(xí)的核心載體在市場需求推動下快速升級,不斷推出更強大的計算能力和更優(yōu)良架構(gòu)的GPU。
最新的GPU 不僅支持神經(jīng)網(wǎng)絡(luò)算法,還支持Caffe、TensorFlow 等深度學(xué)習(xí)框架,這些機器學(xué)習(xí)算法在雷達(dá)目標(biāo)識別技術(shù)中的應(yīng)用是當(dāng)前和未來研究的重點。GPU 能夠快速完成機器學(xué)習(xí)算法從訓(xùn)練到部署的全過程,非常適合未來雷達(dá)向智能化方向發(fā)展。
GPU 高效計算的關(guān)鍵在于軟件的優(yōu)化加速。對于計算密集型、可并行性較高的程序,使用CUDA C 對已有的串行代碼在GPU 上進(jìn)行并行復(fù)現(xiàn)能獲得很好的加速效果。對串行程序并行化的方法有兩種:①對一個完整的項目程序進(jìn)行并行加速,將所有計算步驟放在GPU 完成;②將項目程序中包含大量的計算密集型算法提取出來,單獨導(dǎo)入GPU 進(jìn)行計算。一般情況下采取后一種方式對程序進(jìn)行加速,這樣可在最短的時間內(nèi)獲得好的加速性能。但是要充分發(fā)揮GPU 強大的計算能力還需要對程序性能進(jìn)行調(diào)優(yōu)[8]。CUDA 程序?qū)崿F(xiàn)只是完成了CUDA 加速工作的一小部分,要達(dá)到CUDA 加速的最終目的必須優(yōu)化CUDA 程序[9]。
針對CUDA 程序進(jìn)行優(yōu)化需要采取一定的策略。絕大多數(shù)的GPU 應(yīng)用程序優(yōu)化方法具有較高的優(yōu)先級別,但那些針對特定環(huán)境下的優(yōu)化手段要在較高優(yōu)先級別優(yōu)化完成之后再做調(diào)整[10]。圖1 列出3 個優(yōu)先級中常見的幾個優(yōu)化項。
相對于GPU 動輒達(dá)到Tflops 級別的單精度計算能力,GPU 存儲帶寬大多是GB/s 級別。以英偉達(dá)的Tesla P6 顯卡為例,其單精度浮點計算能力為6.1Tflops,存儲帶寬為192GB/s。要想在Tesla P6 上獲得峰值的計算性能,程序的計算訪存比需要達(dá)到22.25。所以,訪存優(yōu)化成為GPU 性能優(yōu)化的研究重點。
Fig.1 Priority of CUDA program optimization strategy圖1 CUDA 程序優(yōu)化策略優(yōu)先級
全局內(nèi)存(global memory)是GPU 中存儲空間最大、使用頻率最多的內(nèi)存[11]。當(dāng)線程束向內(nèi)存加載數(shù)據(jù)或從內(nèi)存中讀取數(shù)據(jù)時,傳輸帶寬效率一般只與跨線程的內(nèi)存地址分布和每個事物內(nèi)存地址的對齊方式這兩點有關(guān)[12]。一般來說,數(shù)據(jù)傳輸過程中內(nèi)存請求越多,未被使用的字節(jié)被傳回的可能性就越高,會導(dǎo)致數(shù)據(jù)吞吐量降低。
所有的全局內(nèi)存訪問都會通過二級緩存(32Byte 內(nèi)存事務(wù)),有些內(nèi)存訪問會使用速度更快的一級緩存(128Byte內(nèi)存事務(wù))。當(dāng)設(shè)備的內(nèi)存事務(wù)首地址是32Byte(僅使用二級緩存)或者128Byte(使用了一級緩存)的偶數(shù)倍時,就可實現(xiàn)對齊內(nèi)存訪問[13]。在一個線程束中所有32 個線程訪問一個地址連續(xù)的內(nèi)存塊時就能實現(xiàn)合并訪問[14]。
因此可將全局內(nèi)存中的數(shù)據(jù)大小盡量整合成32Byte的整數(shù)倍以增加數(shù)據(jù)對齊的靈活性。對于無法整合的數(shù)據(jù)如結(jié)構(gòu)體,其尺寸和對齊要求可使用對齊修飾符__align__(8)或__align__(16)被編譯器保證。如果受實際情況限制無法實現(xiàn)數(shù)據(jù)對齊或者間隔訪問,就要充分利用共享存儲器來避免程序性能下降。
共享內(nèi)存是位于GPU 流處理器(Stream Processor,SM)中的低延遲內(nèi)存池,該內(nèi)存池被線程塊中的所有線程所共享[15]。在物理層面共享內(nèi)存接近SM,因此相較于全局內(nèi)存而言延遲要低大約20~30 倍,而帶寬高大約10 倍[16]。
在調(diào)用共享內(nèi)存時,線程會通過32 個存儲體(bank)進(jìn)行訪問。當(dāng)線程束中的多個線程在同一Bank 中訪問不同地址數(shù)據(jù)時會發(fā)生存儲體沖突(bank conflict)[17],導(dǎo)致線程對共享內(nèi)存重復(fù)請求,所以多路存儲體沖突會造成訪存阻塞,降低計算性能并影響帶寬利用率[18]。解決這種存儲體沖突的方法是在每N 個元素之后添加一個字,這里的N 是存儲體數(shù)量。由于對內(nèi)存數(shù)據(jù)進(jìn)行了填充,之前屬于同一個bank 的存儲單元現(xiàn)在被傳播到了不同的存儲體中,改變了從字到存儲體的映射,如圖2 所示。
Fig.2 Memory padding to avoid memory conflicts圖2 內(nèi)存填充避免存儲體沖突
計算刀片以Intel 公司的至強E5-2648L V4 14 核CPU為主處理器,用于處理流程的控制和資源的調(diào)度;GPU 刀片以Nvidia 公司的Tesla P6 GPU 為核心,用于系統(tǒng)的高性能并行計算,計算刀片與GPU 刀片之間通過PCIe3.0 x16 的數(shù)據(jù)總線進(jìn)行數(shù)據(jù)傳輸。
使用GPU 對某認(rèn)知雷達(dá)搜索模式下的“和差差”3 個波束、1 024 個脈沖壓縮距離單元、940 個有效距離單元、128 積累點數(shù)的信號進(jìn)行處理。數(shù)據(jù)格式為實部虛部交替存儲。
在頻域上實現(xiàn)匹配濾波,使用CUDA 內(nèi)部的CUFFT 庫來實現(xiàn)快速傅里葉正逆變換。使用CUFFT 實現(xiàn)FFT 需要調(diào)用FFT 句柄完成對數(shù)據(jù)排布和輸出格式的初始化,之后設(shè)定傅里葉變換方向。初始化方式和執(zhí)行傅里葉變換方式如下:
初始化輸入了數(shù)據(jù)維度、排列方式,輸出數(shù)據(jù)的排列方式和輸入輸出的數(shù)據(jù)類型。執(zhí)行函數(shù)規(guī)定輸入輸出的首地址指針和FFT 方向(CUFFT_FORWARDCUFFT_FOR?WARD 是FFT 運算,CUFFT_INVERSECUFFT_INVERSE 是IFFT 運算)。
rank 表示FFT 運算的信號維度;n 是一個數(shù)組,表示進(jìn)行FFT 的每個信號行數(shù),列數(shù)和頁數(shù)與上一個參數(shù)rank 相互呼應(yīng);inembed 表示輸入數(shù)據(jù)的三維點數(shù),[頁數(shù),列數(shù),行數(shù)]、[列數(shù),行數(shù)]或[行數(shù)],若數(shù)據(jù)是一維數(shù)據(jù)該參數(shù)會被忽略;istride 表示每個相鄰輸入信號的直接距離;idist為兩個連續(xù)輸入信號起始元素之間的間隔;onembed 為輸出數(shù)據(jù)情況,同inembed;osteide 和odist 與此同理,batch 為進(jìn)行FFT 運算的信號個數(shù)。
傳輸?shù)皆O(shè)備端的數(shù)據(jù)按照列優(yōu)先的存儲規(guī)則排布,可通過改變參數(shù)istride 與idist 或osteide 與odist 來改變FFT 的輸入輸出數(shù)據(jù)格式。在工程實踐中有時會在矩陣數(shù)據(jù)計算前進(jìn)行轉(zhuǎn)置操作以追求數(shù)據(jù)排布的一致性,可通過句柄初始化設(shè)定數(shù)據(jù)的輸出格式,直接省略轉(zhuǎn)置步驟。超大數(shù)據(jù)的矩陣轉(zhuǎn)置會耗費大量時間,該方法可以有效優(yōu)化運算時間。
頻域的匹配濾波實現(xiàn)就是使用頻域的匹配濾波系數(shù)(脈沖壓縮系數(shù))與經(jīng)過FFT 處理后的信號進(jìn)行向量點乘。在CUDA 中暫時沒有專門針對向量點乘的函數(shù),需要編寫核函數(shù)實現(xiàn)系數(shù)相乘??蓪⑵ヅ錇V波系數(shù)放入常量內(nèi)存或者共享內(nèi)存中以提高數(shù)據(jù)的讀取效率,或者在全局內(nèi)存中采取數(shù)據(jù)對齊合并訪問實現(xiàn)優(yōu)化。
經(jīng)過CUFFT 庫實現(xiàn)的快速傅里葉變換(Fast Fourier transform,F(xiàn)FT)使運算結(jié)果增大2N倍,在使用MatLab 對GPU 計算結(jié)果進(jìn)行誤差分析時需要考慮。使用MatLab 對輸入信號進(jìn)行同樣計算,得到的運算誤差分析如圖3 所示。
由分析結(jié)果可知,GPU 計算結(jié)果的實部與虛部和Mat?Lab 的誤差都在10-4左右??紤]到GPU 上計算的數(shù)據(jù)類型為單精度FLOAT 型,而在MatLab 上計算的數(shù)據(jù)類型都自動轉(zhuǎn)換成雙精度DOUBEL 型,因此0.01%的誤差屬于可接受范圍。在距離單元上對數(shù)據(jù)進(jìn)行裁剪,使距離單元變成有效距離單元940,即可對數(shù)據(jù)進(jìn)行動目標(biāo)檢測處理。
動目標(biāo)檢測(Moving Target Detection,MTD)濾波器組實現(xiàn)方法一般分為兩類:①設(shè)計多階數(shù)的有限脈沖響應(yīng)(Finite Impulse Response,F(xiàn)IR)濾波器組對脈沖壓縮之后的數(shù)據(jù)進(jìn)行濾波[19],該方法能針對回波信號自適應(yīng)降低信號副瓣,但計算量過大,對于硬件的計算能力要求過高;②采用快速傅里葉變換。這種方式計算效率較高,在計算資源有限的情況下能較好完成MTD 任務(wù),但會導(dǎo)致濾波后信號副瓣較高,降低MTD 檢測性能。一般在FFT 運算之前會針對不同的雜波類型對數(shù)據(jù)加上合適的窗函數(shù)以降低副瓣干擾,不過加窗操作會導(dǎo)致主瓣的展寬,降低主瓣的增益。
將與積累點數(shù)相同階數(shù)的二維FIR 系數(shù)矩陣和待處理的數(shù)據(jù)矩陣相乘,實現(xiàn)有限脈沖響應(yīng)濾波器算法,可使用CUDA內(nèi)含的CUBLAS庫專門針對矩陣運算進(jìn)行加速。
CUBALS 庫復(fù)數(shù)矩陣相乘,C=alpha*A*B+beta*C,函數(shù)為:
transa和transb表示矩陣A、B 是否需要在計算前進(jìn)行轉(zhuǎn)置;m,n,k是計算矩陣的維度信息;lda,ldb,ldc是對應(yīng)矩陣的主維度。GPU 上的矩陣存儲方式默認(rèn)列優(yōu)先,有別于C/C++的行優(yōu)先。對矩陣相乘的結(jié)果進(jìn)行求模,導(dǎo)出求模結(jié)果,MTD 輸出結(jié)果和誤差分析如圖4 所示。GPU 和MatLab計算的結(jié)果誤差在0.05%以內(nèi),屬可接受范圍。
Fig.3 Error analysis of pulse compression results圖3 脈沖壓縮結(jié)果誤差分析
Fig.4 MTD result error圖4 MTD 結(jié)果誤差
在某認(rèn)知雷達(dá)中使用恒虛警檢測(Constant False Alarm Rate,CFAR)算法為最大選擇(Greatest Of)算法,在GO-CFAR 檢測器中取兩個局部估計的較大值作為總的雜波功率水平估計,在每次被測目標(biāo)單元更新時,滑動窗口內(nèi)的參考單位都會再次調(diào)用。若還是將數(shù)據(jù)存儲在全局內(nèi)存中,即便將數(shù)據(jù)對齊合并讀取也會因為全局內(nèi)存距離線程較遠(yuǎn)而花銷大量時間,所以需要將被檢測數(shù)據(jù)放在線程讀取速度更快的共享內(nèi)存中。同時因為共享內(nèi)存只能被同一個線程塊中的線程所共享,所以要分配一個線程塊來計算一個多普勒道內(nèi)的數(shù)據(jù),線程塊內(nèi)的每個線程處理一個距離單元,實現(xiàn)細(xì)粒度并行優(yōu)化。
將GPU 處理結(jié)果與MATLAB 的處理結(jié)果進(jìn)行對比,得到各自的CFAR 結(jié)果如圖5 所示。圖中結(jié)果1 表示通過恒虛警檢測門限,0 則表示未通過檢測門限,表示位置沒有檢測到目標(biāo)。脈沖壓縮后的雷達(dá)回波信號存在距離副瓣,強的距離副瓣會產(chǎn)生虛假目標(biāo)[20],所以恒虛警檢測后會出現(xiàn)過門限目標(biāo),若要檢測出目標(biāo)確切位置還需要進(jìn)行點跡凝聚算法。
Fig.5 Comparison of CFAR results(no condensation)圖5 CFAR 結(jié)果對比(未凝聚)
將GPU 處理結(jié)果與MatLab 處理結(jié)果進(jìn)行對比。脈沖壓縮、動目標(biāo)檢測和雜波圖誤差在10-4級別,恒虛警輸出結(jié)果完全一致。對于“和差差”3 個波束,1 024 個脈沖壓縮距離單元,128 積累點數(shù)的脈沖壓縮處理,“和路”波束940 個有效距離單元,128 積累點數(shù)的動目標(biāo)檢測和恒虛警檢測,在GPU 和CPU 下的處理時間對比如表2 所示。
Table 2 Comparison of radar signal processing time in GPU and CPU表2 雷達(dá)信號處理在GPU 與CPU 中的耗時對比
可以看出,在包含大量FFT 和點乘運算的脈沖壓縮和動目標(biāo)檢測部分GPU 加速效果明顯。對于CPU 不擅長的矩陣相乘運算,GPU 表現(xiàn)出驚人的加速效果,在極短時間內(nèi)實現(xiàn)了基于時域有限脈沖響應(yīng)濾波器的MTD。在充分利用計算資源的同時避免了加窗造成的主瓣展寬。在存在大量邏輯運算的CFAR 部分,經(jīng)過GPU 的內(nèi)存優(yōu)化之后性能也得到了較大提升,但與脈沖壓縮和動目標(biāo)檢測相比,加速的幅度較小,仍需要找到更好的優(yōu)化方法。
本文使用CPU+GPU 異構(gòu)計算平臺實現(xiàn)了雷達(dá)信號處理中的脈沖壓縮、動目標(biāo)檢測和恒虛警檢測。由于GPU 強大的并行計算能力,雷達(dá)信號處理算法在經(jīng)過CUDA C 優(yōu)化后較好地提升了計算性能。通過對GPU 的內(nèi)部存儲特性分析和挖掘CUDA 高速計算庫,對已實現(xiàn)的CUDA 程序進(jìn)一步優(yōu)化,二次提升了計算性能。特別是使用FIR 技術(shù)實現(xiàn)MTD 時,在獲得相較于CPU 實現(xiàn)1 000 倍加速之外,還避免了加窗操作對雷達(dá)回波信號主瓣的展寬,降低了主瓣的能量損失。但是,該方法對于內(nèi)含大量邏輯判斷的恒虛警檢測獲得的加速效果有限,后續(xù)需要找到更優(yōu)的加速方案以實現(xiàn)程序的全面優(yōu)化。