王 巖 楊 剛 游英杰
(西安電子工程研究所 西安 710100)
近年來,隨著雷達系統(tǒng)技術(shù)的快速發(fā)展和應(yīng)用需求的不斷增加,傳統(tǒng)以FPGA+DSP為硬件架構(gòu)的雷達信號處理系統(tǒng)面臨著極大的挑戰(zhàn)[1-2]。FPGA具有強大的運算能力和傳輸帶寬,但算法設(shè)計復(fù)雜且不夠靈活,軟件調(diào)試周期長。DSP開發(fā)靈活度高,但單片DSP計算能力較弱,對于運算量高的大型陣列雷達系統(tǒng)需要多片DSP才能完成檢測處理,復(fù)雜的任務(wù)劃分導(dǎo)致程序調(diào)試和維護困難。近些年,雷達信號處理系統(tǒng)開始嘗試使用進口CPU完成處理功能,基于CPU實現(xiàn)雷達信號處理系統(tǒng)便于實現(xiàn)復(fù)雜的算法流程,可以大幅度縮短軟件調(diào)試周期,軟件模塊易于復(fù)用和移植[3-4]。然而長期依賴于進口CPU面臨著嚴重的信息安全隱患以及隨時可能被禁用的風險。在我國大力發(fā)展電子信息軟硬件技術(shù)自主可控的趨勢下,國產(chǎn)CPU和操作系統(tǒng)在近些年得到迅速發(fā)展,其中較為成熟的飛騰FT2000+/64 CPU和銀河麒麟Linux操作系統(tǒng)已在各研究領(lǐng)域嘗試使用[5-6]。
本文基于國產(chǎn)飛騰FT2000+/64 CPU和銀河麒麟Linux操作系統(tǒng)設(shè)計了并行雷達信號處理算法,以雷達信號處理中常用的動目標檢測(Moving Targets Detection,MTD)和恒虛警率(Constant-False-Alarm Rate,CFAR)處理為例,介紹了國產(chǎn)CPU上雷達信號處理的設(shè)計流程、計算誤差和使用不同CPU核時的處理時間。
動目標檢測(Moving Targets Detection,MTD)是一種提高雷達在雜波背景下檢測運動目標的能力的技術(shù),一般使用FFT或多普勒濾波器組抑制雜波,本文使用FIR濾波器的方式進行MTD處理[7]。
恒虛警率(Constant-False-Alarm Rate,CFAR)處理是雷達目標檢測中常用的一種手段,目的是在干擾下保持信號檢測時的虛警率恒定。CFAR處理時需要先根據(jù)檢測單元內(nèi)的噪聲和干擾確定一個門限,然后用此門限和檢測單元信號比較后判斷是否有目標[7]。常用的CFAR處理技術(shù)包括CA(Cell Averaging)-CFAR、GO(Greatest of)-CFAR、OS(Order Statistics)-CFAR等,本文中的測試程序使用GO-CFAR完成恒虛警檢測。
硬件平臺使用國產(chǎn)飛騰FT2000+/64 CPU處理器,該CPU集成64個自主開發(fā)的兼容ARMv8指令集的處理器核,采用基于數(shù)據(jù)親和的多核處理器體系結(jié)構(gòu),計算能力和訪存帶寬在國內(nèi)處于領(lǐng)先水平。
操作系統(tǒng)使用銀河麒麟Linux操作系統(tǒng),該操作系統(tǒng)支持飛騰、龍芯、海光等國產(chǎn)CPU平臺,并且穩(wěn)定易用,支持Qt和Eclipse等開發(fā)環(huán)境,提供配套的編譯、測試和調(diào)試工具,本文中的程序均使用Eclipse編譯和調(diào)試。
計算中間件使用OpenBlas函數(shù)庫,OpenBlas是一個開源的線性代數(shù)運算函數(shù)庫,該函數(shù)庫對于高性能計算有需求的應(yīng)用提供支持。OpenBlas支持FT2000+/64 CPU的ARMv8架構(gòu),在編譯時會根據(jù)所使用的硬件進行優(yōu)化,生成針對所使用硬件效率很高的函數(shù)庫[8]。
并行編程框架使用Pthread編程模型,Pthread是一套基于共享內(nèi)存的線程庫,該線程庫為用戶提供了創(chuàng)建和使用線程的一系列API,用戶在創(chuàng)建線程時可以設(shè)置線程優(yōu)先級、調(diào)度策略和堆棧大小等參數(shù),根據(jù)需要分配每個線程完成的任務(wù)[9]。
本文軟件設(shè)計的處理流程如圖1所示,各模塊間的并行處理采用流水線的方式實現(xiàn),各處理模塊接收上一級模塊輸出的數(shù)據(jù),上一級模塊的數(shù)據(jù)保存在全局內(nèi)存中,后一級模塊直接從全局內(nèi)存地址上獲取數(shù)據(jù)。為了保證各模塊處理時間的穩(wěn)定性,首先對使用到的CPU核進行核隔離,然后在創(chuàng)建線程后,綁定各處理模塊的線程到指定的CPU核上。線程間使用信號量和全局變量等方式通信,讀寫全局變量時使用互斥鎖防止內(nèi)存沖突。各處理模塊使用全局內(nèi)存在線程間共享數(shù)據(jù),使用各模塊獨立的數(shù)據(jù)循環(huán)隊列容忍處理時間的抖動。MTD和CFAR處理模塊使用參數(shù)化設(shè)計,可以根據(jù)需要靈活配置使用的核數(shù)和各線程需要計算的數(shù)據(jù)。
圖1 軟件設(shè)計架構(gòu)
脈沖壓縮數(shù)據(jù)獲取模塊需要創(chuàng)建1個脈壓數(shù)據(jù)獲取線程,并將線程綁定到指定CPU核上。該線程將數(shù)據(jù)保存在一個使用全局內(nèi)存的脈沖壓縮數(shù)據(jù)循環(huán)隊列中,通過累加隊列計數(shù)值全局變量的方式通知MTD模塊處理,使用全局變量的過程中使用內(nèi)存互斥鎖防止沖突。
MTD處理模塊需要創(chuàng)建1個MTD管理線程和多個MTD計算線程,并綁定線程到指定CPU核上。MTD管理線程通過循環(huán)查詢脈壓數(shù)據(jù)隊列計數(shù)值全局變量的方式等待脈壓數(shù)據(jù)到達,讀取脈壓數(shù)據(jù)隊列計數(shù)值的過程中,使用互斥鎖防止內(nèi)存沖突。獲取到脈壓數(shù)據(jù)后,MTD管理線程釋放所有MTD計算線程對應(yīng)的計算開始信號量,并等待所有MTD計算線程結(jié)束信號量。完成計算后,累加MTD數(shù)據(jù)隊列計數(shù)值全局變量,通知CFAR模塊處理。MTD計算線程按照波束數(shù)和距離單元劃分每個線程的任務(wù)。例如,每個PRI包含兩個波束的脈壓數(shù)據(jù),使用4個CPU核時,創(chuàng)建4個MTD計算線程,任務(wù)劃分為每兩個核計算1個波束,每個核計算1/2距離單元的數(shù)據(jù)。使用8個CPU核時,創(chuàng)建8個MTD計算線程,任務(wù)劃分為每4個核計算1個波束,每個核計算1/4距離單元的數(shù)據(jù)。使用16和32個CPU核時,任務(wù)在線程間的劃分方式類似。MTD處理模塊使用FIR濾波器的方式實現(xiàn),每個MTD計算線程將需要計算的數(shù)據(jù)從脈沖壓縮數(shù)據(jù)全局內(nèi)存隊列復(fù)制到臨時內(nèi)存中,通過調(diào)用OpenBlas的復(fù)數(shù)矩陣乘法函數(shù)完成對應(yīng)數(shù)據(jù)段的計算,然后將計算結(jié)果保存在MTD數(shù)據(jù)全局內(nèi)存循環(huán)隊列中,用于后續(xù)的CFAR處理。
CFAR處理模塊需要創(chuàng)建1個CFAR管理線程和多個CFAR計算線程,并綁定線程到指定CPU核上。CFAR管理線程通過循環(huán)查詢MTD數(shù)據(jù)隊列計數(shù)值全局變量的方式等待MTD數(shù)據(jù)到達,讀取MTD數(shù)據(jù)隊列計數(shù)值的過程中,使用互斥鎖防止內(nèi)存沖突。獲取到MTD數(shù)據(jù)后,CFAR管理線程釋放所有CFAR計算線程對應(yīng)的計算開始信號量,并等待所有CFAR計算線程結(jié)束信號量。所有CFAR計算線程完成計算后,將多個CPU核計算的CFAR結(jié)果匯總,并累加CFAR數(shù)據(jù)隊列計數(shù)值全局變量,用于通知后續(xù)處理任務(wù)。CFAR計算線程按照波束數(shù)和積累點數(shù)劃分每個線程的任務(wù)。例如,對于積累點數(shù)為32并且每個PRI含兩個波束的數(shù)據(jù),使用4個CPU核時,創(chuàng)建4個CFAR計算線程,任務(wù)劃分為每兩個核計算1個波束,每個核計算16個PRI的數(shù)據(jù)。使用8個CPU核時,創(chuàng)建8個CFAR計算線程,任務(wù)劃分為每4個核計算1個波束,每個核計算8個PRI的數(shù)據(jù)。使用16和32個CPU核時,任務(wù)在線程間的劃分方式類似。CFAR模塊使用GO-CFAR的方式處理,每個CFAR計算線程將需要計算的MTD數(shù)據(jù)求模值后保存在MTD模值數(shù)據(jù)臨時內(nèi)存中,依次循環(huán)碼片和距離單元完成CFAR檢測,將計算結(jié)果保存在CFAR數(shù)據(jù)全局內(nèi)存循環(huán)隊列中,最后由CFAR管理線程合并每個CPU核的檢測結(jié)果。
本文中使用到的測試數(shù)據(jù)每個CPI的積累點數(shù)為39,每個PRI兩個碼片,每個碼片含兩個波束脈沖壓縮后的數(shù)據(jù),第1個波束的脈沖壓縮數(shù)據(jù)如圖2所示。
圖2 第1個波束脈壓數(shù)據(jù)
圖3為FT2000+ CPU上并行執(zhí)行MTD處理的結(jié)果,圖4為CPU和Matlab對相同的脈沖壓縮數(shù)據(jù)完成MTD處理后結(jié)果的差值。如圖4所示,CPU和Matlab MTD處理結(jié)果的差值在10-4左右,滿足雷達信號處理檢測的誤差要求。
圖3 第1個波束MTD結(jié)果
圖4 第1個波束MTD差值
圖5為FT2000+ CPU上并行執(zhí)行GO-CFAR處理后得到的MTD平面圖,圖6為CPU和Matlab對相同的MTD數(shù)據(jù)完成GO-CFAR處理后得到的MTD平面的差值,結(jié)果顯示,CPU和Matlab GO-CFAR通過檢測的目標點一致。
圖5 第1個波束GO-CFAR結(jié)果
圖6 第1個波束GO-CFAR差值
表1是在FT2000+ CPU上并行執(zhí)行的MTD和CFAR模塊使用不同CPU核時的處理時間和加速比。由于軟件中MTD和CFAR處理模塊使用參數(shù)化設(shè)計,測試時可以靈活配置使用的CPU核數(shù)。程序編譯時僅對MTD和CFAR處理模塊的關(guān)鍵計算函數(shù)進行O3優(yōu)化,分別統(tǒng)計使用不同數(shù)目CPU核時完成100次處理的平均時間,時間單位為ms,括號中的數(shù)值為并行處理的MTD和CFAR模塊相對于串行程序的加速比。測試結(jié)果如表1中所示,CPU上32核并行的MTD處理程序相對于單核串行程序達到了13倍的加速,32核并行的GO-CFAR處理程序相對于單核串行程序達到了19.5倍的加速。對于常規(guī)的雷達信號處理系統(tǒng),FT2000+ CPU可以滿足處理性能的要求。
表1 FT2000+/64 CPU上MTD和CFAR并行處理時間和加速比
表2是在進口的Intel Xeon D2183 CPU上并行執(zhí)行的MTD和GO-CFAR模塊使用不同CPU核時的處理時間,時間單位是ms。Intel Xeon D2183 CPU的單核性能強于國產(chǎn)的FT2000+ CPU,但是該處理器只有16個CPU核,而FT2000+ CPU有64個CPU核,通過增加CPU核數(shù),在FT2000+ CPU上并行執(zhí)行的MTD和CFAR模塊可以達到和Intel Xeon D2183 CPU接近的處理性能。
表2 Intel Xeon D2183 CPU上MTD和CFAR并行處理時間
隨著雷達系統(tǒng)技術(shù)的快速發(fā)展,雷達信號處理的靈活性和國產(chǎn)化需求逐步提高。本文基于國產(chǎn)FT2000+ CPU和銀河麒麟操作系統(tǒng)設(shè)計了并行雷達信號處理算法,測試結(jié)果顯示,國產(chǎn)FT2000+ CPU上并行處理的MTD和CFAR模塊滿足計算精度和處理時間要求。MTD和CFAR處理模塊使用參數(shù)化設(shè)計,可以根據(jù)雷達信號處理系統(tǒng)的需要靈活配置核數(shù)和任務(wù)分配策略。對于有國產(chǎn)化需求的雷達系統(tǒng),使用FT2000+ CPU完成雷達信號處理功能是一種可行的方案。