劉建濤 張海彬
(1.海裝沈陽局駐沈陽地區(qū)第三軍事代表室 沈陽 110003)(2.沈陽遼海裝備有限責任公司 沈陽 110003)
聲納是海軍艦艇的重要裝備,而信號處理是聲納裝備從海洋干擾背景中提取信息的關(guān)鍵過程。近年來,隨著國防發(fā)展的需要,對聲納裝備的性能要求日益提高。信號處理需要處理的數(shù)據(jù)量越來越大,算法復雜度越來越高。以DSP芯片為運算核心的第三代信號處理平臺在處理大規(guī)模數(shù)據(jù)和更復雜的算法時,不得不使用更多的硬件來彌補運算力的不足,隨之而來的則是軟件編程的難度進一步提高[1]。
GPU具有大規(guī)模并行運算的特點,在處理大量數(shù)據(jù)的復雜運算時具有速度優(yōu)勢。同時其具有相對DSP更低的功耗和體積。因此,GPU已經(jīng)成為下一代信號處理平臺的主要研究方向[3~4]。
本文通過分析GPU硬件結(jié)構(gòu),CUDA軟件編程模型和并行架構(gòu),研究嵌入式微型GPU平臺作為水聲信號處理系統(tǒng)。該系統(tǒng)體積非常小,作為信號處理設(shè)備可以應用于無人艇,UUV,聲納浮標等小型水聲探測平臺,其運算量也支持其應用于大型聲納系統(tǒng)。科學實驗使用該系統(tǒng)替代DSP平臺可以節(jié)約大量經(jīng)費,減少負擔。該GPU平臺也支持數(shù)據(jù)庫和深度學習模塊[5~6]。
Jetson系列是英偉達開發(fā)的微型嵌入式平臺,主要應用于移動AI設(shè)備,如配送物流自主機器人,UAV,工廠系統(tǒng)等。該平臺具有高運算量(每秒32萬億次運算),低功耗(30W),高速I/O性能(750Gbps),體積?。?00 mm×105mm)的特點,可以完成如視覺測距、傳感器融合、定位與地圖繪制、障礙物探測,以及對新一代機器人至關(guān)重要的路線規(guī)劃算法等。
研究在該平臺上開發(fā)波束形成,目標識別等算法作為信號處理系統(tǒng),以及嵌入數(shù)據(jù)庫,機器學習模塊。對于水聲信號處理平臺的微型化,數(shù)據(jù)化,智能化具有重要意義。
Jetson agx xavier嵌入式平臺硬件配置如表1所示。
表1 Jetson agx xavier硬件配置
該平臺CPU采用了8核64位ARM,在保證低功耗的情況下,完全可以滿足信號處理程序調(diào)度部分需求。GPU主要負責信號處理程序運算部分,深度學習和計算機視覺任務上達到30Tops的運算速度。512核的Volta GPU支持張量核和混合精度計算,能夠達到11 TFLOPS FP16或22 TOPS INT8計算。Jetson AGX Xavier的雙NVDLA能夠?qū)崿F(xiàn)5TOPS INT8或2.5 TFLOPS FP16性能。內(nèi)存方面,CPU內(nèi)存和GPU顯存共用32GB LPDDR4,在根本上解決了CPU與GPU的數(shù)據(jù)傳輸瓶頸問題,在使用cudaMemcpy進行數(shù)據(jù)傳輸時理論速度達到137GB/s,完全滿足信號處理需求。功耗方面,該平臺功耗最高只有30W,并提供多種模式供設(shè)置。在風扇開啟的情況下,即便滿載運行,設(shè)備溫度也可以保持在30℃左右,而且噪音相當?shù)?,非常適合小型平臺或者無人平臺。
TMS320C6678帶有四片TI最新KeyStone多核心架構(gòu)的TMS320C6678型DSP處理器,每片處理器含有8個DSP內(nèi)核,主頻為1GHz,單核峰值浮點運算能力為16GFLOPS,整板峰值浮點運算能力可達512 GFLOPS。模塊上每片處理器外接2GB的DDR3,整板外部存儲容量為8GB;板內(nèi)兩簇處理器(4片)間可直接進行4×SRIO交換,鏈路線速率默認3.125Gbps,數(shù)據(jù)傳輸不小于800MB/s;板間處理器通信:板卡對外提供2路4×SRIO鏈路(每簇處理器各占1路),鏈路線速率默認3.125Gbps,數(shù)據(jù)傳輸不小于 800MB/s[9]。
由表2可知,在單精度運算能力上一塊Jetson agx xavier的提供的理論運算能力約等于9個整板TMS320C6678。
表2 Jetson agx xavier與TMS320C6678對比
在存儲空間上,Jetson agx xavie為編程人員提供了整片32GB的顯存,相比于TMS320C6678分配在各個芯片上的模式,在內(nèi)存分配上更加方便。
在傳輸速度上,Jetson agx xavier內(nèi)部137GB/s的傳輸速度遠高于DSP的板內(nèi)3.125Gbps的速度。
以上可知,在主要硬件指標上,Jetson agx xavier相比于TMS320C6678擁有較大的優(yōu)勢。
CUDA是英偉達公司在2006年1月推出的一種通用的編程模型,CUDA是一種將GPU作為數(shù)據(jù)并行計算設(shè)備的軟硬件體系。CUDA這種計算模型是以CPU+GPU的一種異構(gòu)模式來工作的。CPU負責整體程序的串行邏輯控制和任務調(diào)度,GPU則用于執(zhí)行一些能夠被高度并行化的并行計算任務[7]。即讓GPU與CPU協(xié)同工作,更確切的說是CPU控制GPU工作。同時CUDA采用了SIMT(單指令多線程)的執(zhí)行模型,即成千上萬的線程執(zhí)行同一條指令[8]。
可編程內(nèi)存:
寄存器(Regiester):對線程私有,數(shù)量有限,線程運行時動態(tài)獲得。
局部存儲器(Local Memory)邏輯上等同于寄存器,但是物理存儲空間位于顯存中,其訪存延遲與全局存儲器相當。
共享存儲器(Shared Memory)為線程公有內(nèi)存,一般總大小為64KB。
全局存儲器(global memory)可以在任何SM設(shè)備上訪問到,是GPU中最大,延遲最高,最常使用的內(nèi)存。
常量內(nèi)存(const memory)駐留在設(shè)備內(nèi)存中,并在每個SM專用的常量緩存中緩存。
紋理內(nèi)存,駐留在設(shè)備內(nèi)存中,并在每個SM的只讀緩存中緩存。
不可編程內(nèi)存:一級緩存。二級緩存,只讀常量緩存和只讀紋理緩存。
每個SM都有一個一級緩存,所有的SM共享一個二級緩存,一級和二級緩存都被用來存儲本地內(nèi)存和全局內(nèi)存中的數(shù)據(jù),也包括寄存器溢出的部分。每個SM也有一個只讀常量緩存和只讀紋理存緩存,它們用于在設(shè)備內(nèi)存中提高來自內(nèi)存空間內(nèi)的讀取性能[9~10]。
CUDA編程模型,包含兩個并行邏輯層,分別是block層和thread層,在執(zhí)行時block映射到SM,thread映射到SP,如何在實際應用程序中高效地開發(fā)這兩個層次的并行是CUDA編程與優(yōu)化關(guān)鍵。
CUDA并行基于kernel實現(xiàn),Kernel函數(shù)是指在GPU上執(zhí)行的函數(shù)。在CPU端配置相應的線程塊(維度),共享存儲容量和CUDA流等信息。
Kernel函數(shù)映射到GPU上執(zhí)行,kernel具有三維的線程網(wǎng)格(grid)-線程塊(block)-線程(thread)結(jié)構(gòu),在執(zhí)行kernel時,一個kernel函數(shù)對應一個grid,對應的block映射到SM,thread映射到SP,GPU通過頻繁的線程切換來實現(xiàn)硬件資源的分時使用,切換開銷極小[11]。
本部分根據(jù)GPU特點和CUDA編程模型設(shè)計頻域波束形成算法的GPU實現(xiàn)。
CUDA程序并行架構(gòu)分為三級,分別是數(shù)據(jù)級并行,核間級并行和任務級并行。數(shù)據(jù)級并行是指通過線程分配在kernel內(nèi)部實現(xiàn)數(shù)據(jù)與數(shù)據(jù)間的并行。核間級并行是指利用流并發(fā)技術(shù)實現(xiàn)kernel間的并行。任務級并行是指利用CPU多線程機制實現(xiàn)多個信號處理任務的并行。
軟件工程中有自頂向下和自下向上兩種設(shè)計方法,根據(jù)并行架構(gòu)特點,選擇自下向上的設(shè)計方式設(shè)計聲納信號處理算法。即首先根據(jù)信號處理任務相關(guān)性,對數(shù)據(jù)級并行進行設(shè)計和優(yōu)化,再分別處理核間級和任務級并行。如對于頻域波束形成算法來說,每個通道的FFT可以設(shè)計為一個kernel。多個kernel并行設(shè)計為核間級并行。進行優(yōu)化并單元測試后,多路通道的FFT運行時間極短,因此將FFT與數(shù)據(jù)與預處理合并為同一任務,在一個CPU線程中運行。對于算法時延補償部分,數(shù)據(jù)級并行即為每個基元的通道時延補償,核間級并行為多個基元并行進行時延補償。后置處理任務因為時間較短,且分支運算較多,可以布置在CPU上運行。
1)數(shù)據(jù)傳輸
Jetson agx xavier內(nèi)部137GB/s,可以滿足大部分工程要求。但是由于PCIE總線帶寬的限制,GPU與CPU,CPU與IO的交互速度都會受到限制,也是GPU延遲的主要因素。
PCIE2.0一般有16通道,每通道速度約為500MB/s,由于數(shù)據(jù)的額外開銷,8GB/s理論帶寬能達到6GB/s。如果軟件要求在CPU和GPU之間頻繁的進行大規(guī)模數(shù)據(jù)交互,會嚴重影響性能。
2)線程束分化
CPU擁有復雜的硬件執(zhí)行分支預測以保證分支運算只付出很小的性能代價,但是GPU是相對簡單的設(shè)備,沒有分支預測機制,一個線程束(32線程)中所有線程在同一周期中必須執(zhí)行相同的指令,因此分支運算會在GPU中產(chǎn)生線程束分化,即一個線程束會執(zhí)行每一個分支路徑。線程束分化會導致性能明顯下降,因此在軟件編程過程中,需要盡量避免線程束分化[12~13]。
3)bank conflict
共享存儲由交替排列的存儲體(bank)構(gòu)成,每個bank大小為4B,如果線程束中多個線程同時訪問同一存儲體的不同地址將會引發(fā)存儲體沖突。一般來說共享存儲的bank數(shù)和線程束內(nèi)線程數(shù)量是一致的[12~13]。
存儲體沖突的后果是在GPU中,不同bank組可以同時訪存,若產(chǎn)生存儲體沖突,多個線程要求訪問同一個bank,每次僅有一個線程能訪問bank,多個線程間要串行訪存,因而導致性能損失。
1)頁鎖定與零拷貝
頁鎖定內(nèi)存在內(nèi)存分配和釋放過程中不可換頁,因此不會被換除內(nèi)存空間,換出到虛擬內(nèi)存中。其傳輸速度是常規(guī)可分頁內(nèi)存的兩倍,可以有效提升CPU與GPU的數(shù)據(jù)交換速度。
利用頁鎖定原理,將該頁面映射到設(shè)備地址空間中,實現(xiàn)零拷貝CPU和GPU都可以直接訪問內(nèi)存地址。
2)分支優(yōu)化
在kernel中,分支操作會產(chǎn)生分支優(yōu)化,浪費GPU性能,因此采取合理的方式優(yōu)化分支操作,可以提升kernel性能。
3)高度并行架構(gòu)設(shè)計
一般來說算法并行度越高,性能越好。但是由于CUDA自帶的加速庫不是針對信號處理算法所設(shè)計,因此使用cufft,cublas等加速庫并不能有效提升性能。
針對信號處理算法特點自行設(shè)計高度并行架構(gòu)可以有效提升算法性能。
試驗環(huán)境:
GPU平臺:Jetson agx xavie,Ubuntu 18.04操作系統(tǒng)
CPU:Intel i7-9700k;
DSP平臺:TMS320C6678
試驗測試不同長度數(shù)據(jù)的向量乘法,向量加法在CPU和GPU上的運行時間。波束形成和一次積累分別在DSP和GPU上運行時間。
表3 GPU和CPU性能對比
表4 GPU和DSP時間對比
Jetson agx xavie相比于DSP信號處理平臺在運算速度上具有很大的優(yōu)勢,一個Jetson agx xavie上可以實現(xiàn)多個信號處理板才能實現(xiàn)的信號處理算法。硬件上,在功耗、散熱、體積三個指標上,Jetson agx xavie也明顯占優(yōu)。
更重要的是,Jetson agx xavie可內(nèi)置數(shù)據(jù)庫模塊和深度學習模塊,對新一代信號處理平臺的數(shù)據(jù)化,智能化具有重要意義,也是后續(xù)研究的重要方向。