楊千禾
(西安電子工程研究所,陜西西安 710100)
隨著電子反偵察技術的完善,雷達面臨著難以捕捉目標、工作環境復雜、多樣化的工作模式和多功能一體化的發展模式。不論從研發角度還是從用戶需求角度都對雷達系統提出了越來越高的要求,雷達技術必須與時俱進。
現代雷達技術發展有兩個重要方向:①合理利用能量,高效獲取信息;②快速適應需求,有效靈活擴展。
目前大量使用的數字陣列雷達以功能為核心,導致雷達型號眾多,軟件與硬件關聯性強,不利于雷達升級和擴展;研制周期長、開發效率低等問題成為雷達使用性能提升瓶頸。在這種環境下,“軟件化雷達”概念孕育而生。軟件化雷達采用“以軟件技術為中心,面向需求”的開發模式,主要思路是通過雷達系統中軟件和硬件的解耦[1],使雷達系統能夠基于軟件化開發模式靈活實現系統功能定義、資源配置、模式擴展和性能提升,以不斷滿足實際需求[2]。
傳統雷達信號處理機使用現場可編程門陣列(Field Programmable Gate Array,FPGA)和數字信號處理器(Digi?tal Signal Processing,DSP),其計算速度雖然能夠滿足要求,在計算上也較為精確,但與FPGA 和DSP 的軟件程序復用性較低,程序調試困難。而僅使用中央處理器(Central Pro?cessing Unit,CPU)作為計算核心的信號處理機,受限于CPU 時鐘頻率和內核數目,在處理實時數據時面臨著系統資源消耗過多、性能下降等問題。
為進一步提升雷達系統計算能力,同時降低后續程序調試難度,實現雷達軟硬件解耦,增強雷達的可重構性,本文使用圖形處理器(Graphics Processor Unit,GPU)代替DSP和FPGA 作為雷達的計算核心,組成GPU+CPU 的異構平臺作為新型的雷達信號處理系統架構。GPU 內含統一計算設備體系結構(Compute Unified Device Architecture,CU?DA),開發人員可使用C 語言對GPU 進行編程。在CUDA下開發的軟件具有很強的可移植性,可滿足所有計算能力在GPU 上直接運行。
當前雷達信號處理機架構實現方式主要有3 種:
(1)基于專用DSP 的分布式信號處理架構。該架構由多個計算板卡組成,每個板卡內含多個DSP 處理器,板卡數量和處理器數量由實際計算資源需求決定,雷達信號處理機通過板卡之間的協同計算實現應用程序開發[3]。該架構優點是系統功耗低,能夠適應不同規模的信號處理需求;缺點是軟硬件解耦能力差,單節點計算能力低,需要在系統數據分發、多節點同步處理和分布式實時通信方面進行技術攻關。
(2)實現方式為基于多核CPU/PowerPC 的分布式信號處理架構[4]。此架構因為有MKL、VSPL 等計算加速開發工具包和準實時的操作系統作支撐,所以開發人員只需完成雷達信號處理應用層軟件的設計[5],此方式提升了軟硬件解耦能力,降低了軟件移植難度,開發效率顯著提高。主要難點是單節點計算能力不夠強大,需要在多節點間進行數據分發、同步處理和實時通信[6]。
(3)基于CPU+GPU 的異構處理架構。主要優點是超強的單節點計算能力與較低的經濟成本,高效的軟件開發效率和支持智能化開發工具包。
相較于DSP/CPU/PowerPC 等處理器,單節點的GPU 具有更強大的浮點計算能力。單個6U VPX 結構的GPU 刀片最高可支持的單精度浮點處理能力達6.1Tflops(Tesla P6),約等于48 片TMS320C6678 的計算量,大大減少了計算節點,降低了系統復雜程度,減少了處理流水延時,如表1 所示。

Table 1 Comparison of floating point processing capacity of main devices表1 主要器件浮點處理能力對比
對于大型數字陣列雷達,需要同時形成多個不同指向的數字接收波束,完成對指定發射空域的覆蓋[7]。因此,需要配備計算能力強大的信號處理機。由于功耗和面積限制,1 塊6U 板卡最多支持8 片TMS320C6678 的多核DSP 處理器;或者是1 片E5-2648LV4 的CPU 處理器,單板浮點處理能力為896Gflops;亦或是最多支持4 片T4240 處理器,單板浮點處理能力為768Gflops。雖然1 塊6U 板卡只能搭載1個MXM 接口的Tesla P6 GPU,但這個板卡的計算處理能力可達6.1Tflops。
相較于DPS/FPGA 動輒十幾分鐘甚至一個小時的燒寫時間,GPU 軟件編譯僅需幾秒,程序調試幾乎支持所有的C/C++集成開發環境,擺脫了仿真器束縛,大大增加了靈活性。與CPU/PowerPC 的處理平臺相比,單節點處理能力更強,板卡數量大大減少,減少了節點之間的數據傳輸,使系統復雜程度降低。目前市場上的計算級GPU 以英偉達公司的板卡為主,CUDA 驅動的向下兼容和向上兼容都較穩定,使CUDA 程序具有較好的可移植性,避免再次開發相似功能,節省了人力資源,降低了開發難度,提高了開發效率。在面對更大計算需求時可以靈活擴展或升級GPU 卡。
近年機器學習的興起對高性能計算需求越來越大。GPU 作為目前機器學習的核心載體在市場需求推動下快速升級,不斷推出更強大的計算能力和更優良架構的GPU。
最新的GPU 不僅支持神經網絡算法,還支持Caffe、TensorFlow 等深度學習框架,這些機器學習算法在雷達目標識別技術中的應用是當前和未來研究的重點。GPU 能夠快速完成機器學習算法從訓練到部署的全過程,非常適合未來雷達向智能化方向發展。
GPU 高效計算的關鍵在于軟件的優化加速。對于計算密集型、可并行性較高的程序,使用CUDA C 對已有的串行代碼在GPU 上進行并行復現能獲得很好的加速效果。對串行程序并行化的方法有兩種:①對一個完整的項目程序進行并行加速,將所有計算步驟放在GPU 完成;②將項目程序中包含大量的計算密集型算法提取出來,單獨導入GPU 進行計算。一般情況下采取后一種方式對程序進行加速,這樣可在最短的時間內獲得好的加速性能。但是要充分發揮GPU 強大的計算能力還需要對程序性能進行調優[8]。CUDA 程序實現只是完成了CUDA 加速工作的一小部分,要達到CUDA 加速的最終目的必須優化CUDA 程序[9]。
針對CUDA 程序進行優化需要采取一定的策略。絕大多數的GPU 應用程序優化方法具有較高的優先級別,但那些針對特定環境下的優化手段要在較高優先級別優化完成之后再做調整[10]。圖1 列出3 個優先級中常見的幾個優化項。
相對于GPU 動輒達到Tflops 級別的單精度計算能力,GPU 存儲帶寬大多是GB/s 級別。以英偉達的Tesla P6 顯卡為例,其單精度浮點計算能力為6.1Tflops,存儲帶寬為192GB/s。要想在Tesla P6 上獲得峰值的計算性能,程序的計算訪存比需要達到22.25。所以,訪存優化成為GPU 性能優化的研究重點。

Fig.1 Priority of CUDA program optimization strategy圖1 CUDA 程序優化策略優先級
全局內存(global memory)是GPU 中存儲空間最大、使用頻率最多的內存[11]。當線程束向內存加載數據或從內存中讀取數據時,傳輸帶寬效率一般只與跨線程的內存地址分布和每個事物內存地址的對齊方式這兩點有關[12]。一般來說,數據傳輸過程中內存請求越多,未被使用的字節被傳回的可能性就越高,會導致數據吞吐量降低。
所有的全局內存訪問都會通過二級緩存(32Byte 內存事務),有些內存訪問會使用速度更快的一級緩存(128Byte內存事務)。當設備的內存事務首地址是32Byte(僅使用二級緩存)或者128Byte(使用了一級緩存)的偶數倍時,就可實現對齊內存訪問[13]。在一個線程束中所有32 個線程訪問一個地址連續的內存塊時就能實現合并訪問[14]。
因此可將全局內存中的數據大小盡量整合成32Byte的整數倍以增加數據對齊的靈活性。對于無法整合的數據如結構體,其尺寸和對齊要求可使用對齊修飾符__align__(8)或__align__(16)被編譯器保證。如果受實際情況限制無法實現數據對齊或者間隔訪問,就要充分利用共享存儲器來避免程序性能下降。
共享內存是位于GPU 流處理器(Stream Processor,SM)中的低延遲內存池,該內存池被線程塊中的所有線程所共享[15]。在物理層面共享內存接近SM,因此相較于全局內存而言延遲要低大約20~30 倍,而帶寬高大約10 倍[16]。
在調用共享內存時,線程會通過32 個存儲體(bank)進行訪問。當線程束中的多個線程在同一Bank 中訪問不同地址數據時會發生存儲體沖突(bank conflict)[17],導致線程對共享內存重復請求,所以多路存儲體沖突會造成訪存阻塞,降低計算性能并影響帶寬利用率[18]。解決這種存儲體沖突的方法是在每N 個元素之后添加一個字,這里的N 是存儲體數量。由于對內存數據進行了填充,之前屬于同一個bank 的存儲單元現在被傳播到了不同的存儲體中,改變了從字到存儲體的映射,如圖2 所示。

Fig.2 Memory padding to avoid memory conflicts圖2 內存填充避免存儲體沖突
計算刀片以Intel 公司的至強E5-2648L V4 14 核CPU為主處理器,用于處理流程的控制和資源的調度;GPU 刀片以Nvidia 公司的Tesla P6 GPU 為核心,用于系統的高性能并行計算,計算刀片與GPU 刀片之間通過PCIe3.0 x16 的數據總線進行數據傳輸。
使用GPU 對某認知雷達搜索模式下的“和差差”3 個波束、1 024 個脈沖壓縮距離單元、940 個有效距離單元、128 積累點數的信號進行處理。數據格式為實部虛部交替存儲。
在頻域上實現匹配濾波,使用CUDA 內部的CUFFT 庫來實現快速傅里葉正逆變換。使用CUFFT 實現FFT 需要調用FFT 句柄完成對數據排布和輸出格式的初始化,之后設定傅里葉變換方向。初始化方式和執行傅里葉變換方式如下:

初始化輸入了數據維度、排列方式,輸出數據的排列方式和輸入輸出的數據類型。執行函數規定輸入輸出的首地址指針和FFT 方向(CUFFT_FORWARDCUFFT_FOR?WARD 是FFT 運算,CUFFT_INVERSECUFFT_INVERSE 是IFFT 運算)。
rank 表示FFT 運算的信號維度;n 是一個數組,表示進行FFT 的每個信號行數,列數和頁數與上一個參數rank 相互呼應;inembed 表示輸入數據的三維點數,[頁數,列數,行數]、[列數,行數]或[行數],若數據是一維數據該參數會被忽略;istride 表示每個相鄰輸入信號的直接距離;idist為兩個連續輸入信號起始元素之間的間隔;onembed 為輸出數據情況,同inembed;osteide 和odist 與此同理,batch 為進行FFT 運算的信號個數。
傳輸到設備端的數據按照列優先的存儲規則排布,可通過改變參數istride 與idist 或osteide 與odist 來改變FFT 的輸入輸出數據格式。在工程實踐中有時會在矩陣數據計算前進行轉置操作以追求數據排布的一致性,可通過句柄初始化設定數據的輸出格式,直接省略轉置步驟。超大數據的矩陣轉置會耗費大量時間,該方法可以有效優化運算時間。
頻域的匹配濾波實現就是使用頻域的匹配濾波系數(脈沖壓縮系數)與經過FFT 處理后的信號進行向量點乘。在CUDA 中暫時沒有專門針對向量點乘的函數,需要編寫核函數實現系數相乘。可將匹配濾波系數放入常量內存或者共享內存中以提高數據的讀取效率,或者在全局內存中采取數據對齊合并訪問實現優化。
經過CUFFT 庫實現的快速傅里葉變換(Fast Fourier transform,FFT)使運算結果增大2N倍,在使用MatLab 對GPU 計算結果進行誤差分析時需要考慮。使用MatLab 對輸入信號進行同樣計算,得到的運算誤差分析如圖3 所示。
由分析結果可知,GPU 計算結果的實部與虛部和Mat?Lab 的誤差都在10-4左右。考慮到GPU 上計算的數據類型為單精度FLOAT 型,而在MatLab 上計算的數據類型都自動轉換成雙精度DOUBEL 型,因此0.01%的誤差屬于可接受范圍。在距離單元上對數據進行裁剪,使距離單元變成有效距離單元940,即可對數據進行動目標檢測處理。
動目標檢測(Moving Target Detection,MTD)濾波器組實現方法一般分為兩類:①設計多階數的有限脈沖響應(Finite Impulse Response,FIR)濾波器組對脈沖壓縮之后的數據進行濾波[19],該方法能針對回波信號自適應降低信號副瓣,但計算量過大,對于硬件的計算能力要求過高;②采用快速傅里葉變換。這種方式計算效率較高,在計算資源有限的情況下能較好完成MTD 任務,但會導致濾波后信號副瓣較高,降低MTD 檢測性能。一般在FFT 運算之前會針對不同的雜波類型對數據加上合適的窗函數以降低副瓣干擾,不過加窗操作會導致主瓣的展寬,降低主瓣的增益。
將與積累點數相同階數的二維FIR 系數矩陣和待處理的數據矩陣相乘,實現有限脈沖響應濾波器算法,可使用CUDA內含的CUBLAS庫專門針對矩陣運算進行加速。
CUBALS 庫復數矩陣相乘,C=alpha*A*B+beta*C,函數為:

transa和transb表示矩陣A、B 是否需要在計算前進行轉置;m,n,k是計算矩陣的維度信息;lda,ldb,ldc是對應矩陣的主維度。GPU 上的矩陣存儲方式默認列優先,有別于C/C++的行優先。對矩陣相乘的結果進行求模,導出求模結果,MTD 輸出結果和誤差分析如圖4 所示。GPU 和MatLab計算的結果誤差在0.05%以內,屬可接受范圍。

Fig.3 Error analysis of pulse compression results圖3 脈沖壓縮結果誤差分析

Fig.4 MTD result error圖4 MTD 結果誤差
在某認知雷達中使用恒虛警檢測(Constant False Alarm Rate,CFAR)算法為最大選擇(Greatest Of)算法,在GO-CFAR 檢測器中取兩個局部估計的較大值作為總的雜波功率水平估計,在每次被測目標單元更新時,滑動窗口內的參考單位都會再次調用。若還是將數據存儲在全局內存中,即便將數據對齊合并讀取也會因為全局內存距離線程較遠而花銷大量時間,所以需要將被檢測數據放在線程讀取速度更快的共享內存中。同時因為共享內存只能被同一個線程塊中的線程所共享,所以要分配一個線程塊來計算一個多普勒道內的數據,線程塊內的每個線程處理一個距離單元,實現細粒度并行優化。
將GPU 處理結果與MATLAB 的處理結果進行對比,得到各自的CFAR 結果如圖5 所示。圖中結果1 表示通過恒虛警檢測門限,0 則表示未通過檢測門限,表示位置沒有檢測到目標。脈沖壓縮后的雷達回波信號存在距離副瓣,強的距離副瓣會產生虛假目標[20],所以恒虛警檢測后會出現過門限目標,若要檢測出目標確切位置還需要進行點跡凝聚算法。

Fig.5 Comparison of CFAR results(no condensation)圖5 CFAR 結果對比(未凝聚)
將GPU 處理結果與MatLab 處理結果進行對比。脈沖壓縮、動目標檢測和雜波圖誤差在10-4級別,恒虛警輸出結果完全一致。對于“和差差”3 個波束,1 024 個脈沖壓縮距離單元,128 積累點數的脈沖壓縮處理,“和路”波束940 個有效距離單元,128 積累點數的動目標檢測和恒虛警檢測,在GPU 和CPU 下的處理時間對比如表2 所示。

Table 2 Comparison of radar signal processing time in GPU and CPU表2 雷達信號處理在GPU 與CPU 中的耗時對比
可以看出,在包含大量FFT 和點乘運算的脈沖壓縮和動目標檢測部分GPU 加速效果明顯。對于CPU 不擅長的矩陣相乘運算,GPU 表現出驚人的加速效果,在極短時間內實現了基于時域有限脈沖響應濾波器的MTD。在充分利用計算資源的同時避免了加窗造成的主瓣展寬。在存在大量邏輯運算的CFAR 部分,經過GPU 的內存優化之后性能也得到了較大提升,但與脈沖壓縮和動目標檢測相比,加速的幅度較小,仍需要找到更好的優化方法。
本文使用CPU+GPU 異構計算平臺實現了雷達信號處理中的脈沖壓縮、動目標檢測和恒虛警檢測。由于GPU 強大的并行計算能力,雷達信號處理算法在經過CUDA C 優化后較好地提升了計算性能。通過對GPU 的內部存儲特性分析和挖掘CUDA 高速計算庫,對已實現的CUDA 程序進一步優化,二次提升了計算性能。特別是使用FIR 技術實現MTD 時,在獲得相較于CPU 實現1 000 倍加速之外,還避免了加窗操作對雷達回波信號主瓣的展寬,降低了主瓣的能量損失。但是,該方法對于內含大量邏輯判斷的恒虛警檢測獲得的加速效果有限,后續需要找到更優的加速方案以實現程序的全面優化。