《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 設(shè)計(jì)應(yīng)用 > 基于CUDA技術(shù)模擬雷達(dá)余輝的方法
基于CUDA技術(shù)模擬雷達(dá)余輝的方法
來源:微型機(jī)與應(yīng)用2011年第8期
謝永亮,,湯曉迪,劉尚富,曾海兵
(海軍蚌埠士官學(xué)校,安徽 蚌埠233000)
摘要: 分析了目前基于光柵顯示器模擬雷達(dá)余輝的方法,。針對(duì)實(shí)現(xiàn)逼真余輝效果存在的主要瓶頸,,通過采用CUDA技術(shù)可以解決模擬余輝時(shí)龐大的計(jì)算量的問題,。主要采用CPU+GPU的編程模式模擬余輝,,在GPU中為每一個(gè)像素點(diǎn)創(chuàng)建一個(gè)并行執(zhí)行的線程來完成整個(gè)屏幕像素的數(shù)據(jù)處理,,使得余輝效果逼真,、畫面流暢、掃描速度大幅提高,。
Abstract:
Key words :

摘  要: 分析了目前基于光柵顯示器模擬雷達(dá)余輝的方法,。針對(duì)實(shí)現(xiàn)逼真余輝效果存在的主要瓶頸,通過采用CUDA技術(shù)可以解決模擬余輝時(shí)龐大的計(jì)算量的問題,。主要采用CPU+GPU的編程模式模擬余輝,,在GPU中為每一個(gè)像素點(diǎn)創(chuàng)建一個(gè)并行執(zhí)行的線程來完成整個(gè)屏幕像素的數(shù)據(jù)處理,使得余輝效果逼真,、畫面流暢,、掃描速度大幅提高。
關(guān)鍵詞: CUDA,;CPU+GPU,;雷達(dá)余輝;光柵掃描

 在建立雷達(dá)虛擬操作系統(tǒng)或維修訓(xùn)練系統(tǒng)時(shí),,顯示器的仿真效果直接影響模擬器的訓(xùn)練效果,。目前制約余輝實(shí)現(xiàn)的主要瓶頸是余輝效果帶來的龐大的計(jì)算量,使得效果較好的余輝掃描線轉(zhuǎn)速難以超過10轉(zhuǎn)/s,,如果要提高轉(zhuǎn)速,,則需要以犧牲顯示畫質(zhì)為代價(jià)?;?a class="innerlink" href="http://forexkbc.com/tags/光柵掃描" title="光柵掃描" target="_blank">光柵掃描余輝模擬的主流方法有畫線法,、固定扇掃法、逐點(diǎn)消隱法,,由于前兩者圖像易出現(xiàn)輻射狀花紋及掃描速率不穩(wěn)定,,因此后者的應(yīng)用較多,效果也明顯強(qiáng)于前者[1],。本文在逐點(diǎn)消隱法的基礎(chǔ)上應(yīng)用CUDA技術(shù),,解決了運(yùn)算量巨大的問題,在光柵顯示器上得到了余輝效果逼真,、畫面流暢的余輝圖形,。
1 余輝仿真的瓶頸
    傳統(tǒng)的雷達(dá)P顯采用示波管作為顯示終端,其內(nèi)部熒光材料具有指數(shù)型衰減的余輝效應(yīng),,電子束掃描線圓周掃過屏幕將留下逐漸消隱的余輝[2],。但光柵顯示器無法自動(dòng)產(chǎn)生熒光粉的余輝效應(yīng),因此必須人為地模擬余輝效應(yīng)。
    軟模擬通常采用光柵顯示器,,用計(jì)算機(jī)編程實(shí)現(xiàn),。光柵掃描顯示器具有高亮度、高穩(wěn)定度,、大容量顯示的圖文處理能力,、豐富的色彩及多灰度等級(jí)的優(yōu)點(diǎn)。一般采用以下三種方法實(shí)現(xiàn)[3-4],。
    (1)畫線法較容易實(shí)現(xiàn),,原理是在屏幕上以畫直線的方式畫出每一角度的掃描線,形成每次畫一個(gè)扇面的灰度遞減的直線簇,。但是當(dāng)程序運(yùn)行時(shí),,掃描線軌跡不斷地在屏幕上轉(zhuǎn)動(dòng),該方法不能無縫地覆蓋整個(gè)扇掃區(qū)域,,從而產(chǎn)生一個(gè)輻射狀的固定花紋,。
    (2)固定扇掃法是在畫線法基礎(chǔ)上改進(jìn)的一種仿真方法,控制扇形區(qū)域的圓心角,,依次使不同扇形區(qū)域亮度減少,。它雖然消除了輻射狀花紋,但在沒有目標(biāo)到有目標(biāo)信號(hào)時(shí),,由于數(shù)據(jù)量的增加會(huì)造成掃描線的轉(zhuǎn)速不同,。
    (3)逐點(diǎn)消隱法,主要原理是將每個(gè)方位像素的亮度逐次遞減,,即每個(gè)點(diǎn)都必須被修改,,這樣整個(gè)屏幕畫面亮度逐漸衰減。其產(chǎn)生的余輝效果比較逼真,,掃描線轉(zhuǎn)速也較穩(wěn)定,。
    模擬逼真的余輝效果,一般采用逐點(diǎn)消隱法,,十分逼真的余輝仿真需要非常高的數(shù)據(jù)吞吐率,,要求在每一顯示幀的時(shí)間內(nèi)(一般為60 Hz的倒數(shù)約16 ms)對(duì)屏幕中所有像素進(jìn)行一次衰減運(yùn)算。以公認(rèn)的高效算法,,即查表法為例:對(duì)于一個(gè)像素點(diǎn)而言,,最少需要1次讀和2次寫操作,分辨率為1 024×1 024的屏幕中會(huì)有1 024×1 024個(gè)像素點(diǎn)參與雷達(dá)回波的顯示,,數(shù)量約為1 M。即在16 ms的時(shí)間內(nèi)需要進(jìn)行1 M次讀操作和2 M次寫操作,,分給每個(gè)像素點(diǎn)的時(shí)間為16 ns,。由于Windows屬于通用型操作系統(tǒng),硬件操作過程極其復(fù)雜,無論如何也無法在16 ns內(nèi)完成1次讀和2次寫操作,。需要說明的是,,現(xiàn)有的用PC實(shí)現(xiàn)的余輝仿真算法都是以犧牲畫質(zhì)為前提條件的,例如有的算法降低角度分辨率,,有的算法只運(yùn)算部分像素,。

 


2 瓶頸的解決方案
    為了解決此瓶頸,本文將國(guó)外主要應(yīng)用于3D游戲設(shè)計(jì)的CUDA技術(shù)移植到余輝的模擬上,。CUDA(統(tǒng)一計(jì)算設(shè)備架構(gòu))是NVIDIA公司在2007年推出的針對(duì)GPGPU(通用計(jì)算GPU)的一個(gè)全新構(gòu)想,,使專注于圖像處理的GPU超高性能在數(shù)據(jù)處理和科學(xué)計(jì)算等通用計(jì)算領(lǐng)域發(fā)揮優(yōu)勢(shì)[5]。
    GPU特別適合并行數(shù)據(jù)運(yùn)算問題,,同一個(gè)程序可操作許多并行數(shù)據(jù)元素,,并具有高運(yùn)算密度(算術(shù)運(yùn)算與內(nèi)存操作的比例),且在高密度運(yùn)算時(shí),,GPU訪問內(nèi)存的延遲可以被掩蓋,。目前高端GPU計(jì)算性能已達(dá)到Teraflops(每秒萬億次浮點(diǎn)運(yùn)算)級(jí)別,其運(yùn)算速度遠(yuǎn)遠(yuǎn)高于CPU的速度[6-7],。2008年初國(guó)內(nèi)建成的首套實(shí)驗(yàn)系統(tǒng),,其計(jì)算性能的理論峰值124 Teraflops,可用峰值82 Teraflops,。
    但是常規(guī)的GPU通用計(jì)算還存在以下問題[7]:編程過于繁雜,,難以學(xué)習(xí)與使用,在非圖形領(lǐng)域應(yīng)用很不充分,;GPU編程缺乏靈活性,,對(duì)GPU性能的發(fā)揮有很大的限制。
    而CUDA采用GPU+CPU的方式,,通過標(biāo)準(zhǔn)C語言將GPU的眾多的計(jì)算特性結(jié)合到一起,,由線程來創(chuàng)建應(yīng)用程序。程序代碼在實(shí)際執(zhí)行中分為兩種,,一種是運(yùn)行在CPU上的主機(jī)代碼,,另一種是運(yùn)行在GPU上的設(shè)備代碼。它類似于CPU上的多線程程序,,但與僅能有很少線程同時(shí)工作的多核CPU相比,,GPU可以同時(shí)執(zhí)行成千上萬個(gè)線程[8-9]。CPU程序以異步的方式調(diào)用GPU核程序,,GPU作為CPU的協(xié)處理器(CoProeessor)提供服務(wù),。
    當(dāng)前CUDA提供的主要功能如下[7]:
    (1)在GPU上提供標(biāo)準(zhǔn)C編程語言。
    (2)為在支持CUDA的NVIDIA GPU的并行計(jì)算提供統(tǒng)一的軟硬件解決方案,。
    (3)支持CUDA的GPU能進(jìn)行并行數(shù)據(jù)緩存和線程執(zhí)行管理,。
    (4)經(jīng)過優(yōu)化的,從CPU到支持CUDA的GPU的直接上傳、下載通道,。
    (5)CUDA驅(qū)動(dòng)與DirectX和OpenGL等圖形驅(qū)動(dòng)程序兼容,。
    為了解決巨大計(jì)算量的問題,主要采用CPU+GPU的編程模式來模擬余輝,,在GPU中為每一個(gè)像素點(diǎn)創(chuàng)建一個(gè)線程獨(dú)立進(jìn)行亮度衰減處理,。由于每個(gè)像素的線程并行執(zhí)行,完成整個(gè)屏幕像素的數(shù)據(jù)處理幾乎不需要計(jì)算時(shí)間,,真正花費(fèi)時(shí)間的是畫面繪制和翻轉(zhuǎn),。因此繪制畫面在后臺(tái)表面進(jìn)行,繪制完成后翻轉(zhuǎn)到前臺(tái)顯示,,這樣繪制和顯示可以同時(shí)進(jìn)行,,既為畫面的繪制留足了時(shí)間,又能得到流暢不閃爍的畫質(zhì),。
3 采用CUDA技術(shù)來實(shí)現(xiàn)余輝效果
    為了產(chǎn)生不同方位的掃描線,,將方位、距離進(jìn)行量化,,由于掃描區(qū)域的分辨率為1 024×1 024,,因此半徑為512像素。由于掃描半徑為512個(gè)像素,,理論上只要角度量化數(shù)N大于3 217就不會(huì)出現(xiàn)顯示死地址的現(xiàn)象[10],,方位上量化為4 096個(gè)等分。這樣初始生成一個(gè)4 096×512個(gè)像素的圓域,。雷達(dá)P顯中采用的是極坐標(biāo)系,,而在光柵顯示器中采用的是直角坐標(biāo),通過坐標(biāo)變換,,將建立一張坐標(biāo)變換表,,如表1所示。

    通過查表可以避免坐標(biāo)變換帶來的正余弦計(jì)算,,方便地在極坐標(biāo)和直角坐標(biāo)間轉(zhuǎn)換,,從而節(jié)省大量的運(yùn)算時(shí)間[11]??紤]到近距離區(qū)域,,多個(gè)角度的距離單元會(huì)對(duì)應(yīng)相同的像素點(diǎn),首先為每個(gè)像素點(diǎn)定義一個(gè)屬性的結(jié)構(gòu)體:
    typedef  struct
    {    WORD  x;//屏幕直角坐標(biāo)x
        WORD  y;//屏幕直角坐標(biāo)y
        WORD  ScanlinePtIndex;//該點(diǎn)在掃描線上的
//距離索引
        BYTE MapTo2Pt;//該點(diǎn)與同一條掃描上的
//點(diǎn)是否重合
        BYTE RadEnd;//標(biāo)記該條掃描線處理完畢
    }RADIUSPOINT;
    為圓域內(nèi)的點(diǎn)分配內(nèi)存空間:
    RADIUSPOINT m_pRadPtToLintPtMap=new  RADIUSPOINT[4 096×512],。
    對(duì)于同一條掃描線上相鄰的兩點(diǎn),,如果直角坐標(biāo)相同就把MapTo2Pt設(shè)為1,標(biāo)記為相同的點(diǎn),;如果相鄰兩點(diǎn)的直角坐標(biāo)不相同,,則把距離索引值賦給ScanlinePtIndex,,每條線最后一個(gè)點(diǎn)設(shè)置RadEnd為1來標(biāo)記每條線處理已完畢。對(duì)于相鄰兩條線上的點(diǎn),,如果當(dāng)前線上點(diǎn)與前一條線上相鄰4個(gè)點(diǎn)的直角坐標(biāo)相等,設(shè)置為m_pPixelOverlap[i]=1,,否則設(shè)為0,。
    考慮到余輝呈指數(shù)型衰減,而指數(shù)運(yùn)算需要花費(fèi)大量的時(shí)間,,對(duì)于計(jì)算機(jī),,其最快的操作是取值和賦值,為了提高光柵掃描雷達(dá)顯示系統(tǒng)的實(shí)時(shí)性,,需要提高單位時(shí)間內(nèi)能夠處理的像素點(diǎn)個(gè)數(shù),。于是對(duì)指數(shù)運(yùn)算采用查表法以提高速度,維護(hù)一張按角度劃分的指數(shù)型衰減因子表m_wAttenuation[4 096]以進(jìn)行數(shù)值的取值和賦值操作,。
    同時(shí)還要建立一個(gè)Brightness[4 096×512]的亮度表,,來存儲(chǔ)每個(gè)像素對(duì)應(yīng)的RGB顏色值。
    以上這些工作在程序的初始化中即完成,,一經(jīng)完成即可在后續(xù)的程序中直接調(diào)用,。
    通過CUDA編程時(shí),GPU可看作為可以并行執(zhí)行非常多個(gè)線程的計(jì)算設(shè)備,,執(zhí)行并行計(jì)算的線程被組織成線程塊(Block),,每個(gè)線程塊可以包含多達(dá)512個(gè)線程,而線程塊又組成了柵格(Grid),。GPU可以支持成百上千萬個(gè)并行線程,,于是可以為每個(gè)像素點(diǎn)開一個(gè)線程,這樣每個(gè)像素點(diǎn)可以并行處理,,能極大地提高對(duì)整個(gè)屏幕像素的處理速度,,為CPU留出足夠多的時(shí)間去處理其他相關(guān)的任務(wù)。
    定義線程塊Block包含的線程維數(shù):
    dim3 threads(BLOCK_SIZE,BLOCK_SIZE),;
    定義柵格Grid包含的線程塊數(shù):
    dim3 grid(Width/threads.x,Height/ threads.y),;
    每個(gè)像素點(diǎn)對(duì)應(yīng)的線程處理工作如下:
    由于某型雷達(dá)轉(zhuǎn)速為10轉(zhuǎn)/min,相當(dāng)于每次更新的掃描線數(shù)應(yīng)為4 096×10/60/1 000=0.683條/ms,,像素處理在GPU中并行進(jìn)行,,對(duì)CPU的占用率幾乎為零,所消耗的時(shí)間主要是Direct3D紋理的繪制和表面的翻轉(zhuǎn),,大約為16 ms,,因此每次更新的掃描線數(shù)目約為16×0.683=10.928,即每次更新11條,。將當(dāng)前要更新的掃描線上的像素點(diǎn)設(shè)為初始亮度,,其后的每條掃描線上的像素點(diǎn)的亮度按與當(dāng)前掃描線角度差m_anglediff取m_wAttenuation[m_anglediff]的亮度進(jìn)行衰減,。由于近距離區(qū)域多個(gè)角度的距離單元對(duì)應(yīng)相同的像素點(diǎn),因此中心部位被消隱的次數(shù)明顯要比其他部位多,,導(dǎo)致效果有些失真,。于是需要對(duì)這些坐標(biāo)相同的點(diǎn)進(jìn)行處理,對(duì)于屬性MapTo2Pt為1的點(diǎn),,比較坐標(biāo)相同的點(diǎn)處于不同距離時(shí)的亮度,,取其大者賦值給亮度表Brightness[4 096×512]。對(duì)于屬性m_pPixelOverlap為1的點(diǎn),,比較處于各個(gè)角度時(shí)的亮度,,取其大者賦值給亮度表。這樣對(duì)于同一個(gè)點(diǎn)只顯示一次且取其最亮者顯示,,較好地避免了中心部位被消隱次數(shù)過多的情況,。
    對(duì)于實(shí)現(xiàn)余輝等級(jí)的情況,只需要調(diào)制m_wAttenuation的大小就可以方便地調(diào)節(jié)余輝等級(jí),。如果需要提高轉(zhuǎn)速,,只需增大每次更新的掃描線數(shù)目即可,且基本不會(huì)影響程序運(yùn)行速度,。
    通過CPU+GPU組合的方式模擬不同等級(jí)余輝效果如圖1,、圖2所示,此時(shí)對(duì)應(yīng)的CPU占用率幾乎為零,,如圖3所示,。該方法得到的余輝效果逼真、畫面流暢,、掃描速度達(dá)到了預(yù)定的10轉(zhuǎn)/s的要求,,且CPU占用率極低,并不妨礙CPU處理其他數(shù)據(jù),。

    當(dāng)把每次需要更新的掃描線數(shù)目增多時(shí),,由于GPU能并行高速處理每個(gè)像素點(diǎn),掃描的速度能迅速提升而不影響顯示畫質(zhì),,在程序調(diào)試時(shí),,可以驗(yàn)證當(dāng)掃描速度到45轉(zhuǎn)/min時(shí),畫面依然流暢且占用的系統(tǒng)資源少,。
    余輝實(shí)現(xiàn)的逼真程度很大程度上決定了雷達(dá)模擬器的效果,,本文就當(dāng)前余輝模擬存在的瓶頸提出了一種基于CUDA的解決方案,采用“CPU+DPU”編程的方法,,很好地解決了數(shù)據(jù)吞吐量巨大的問題,。此方法模擬的余輝易于與雷達(dá)回波信號(hào)疊加,便于程序的擴(kuò)展,,可以應(yīng)用于模擬器的設(shè)計(jì)及雷達(dá)技術(shù)的研發(fā),。
參考文獻(xiàn)
[1] 朱兵.基于余輝地址表的雷達(dá)顯示余輝模擬方法[J].艦船電子對(duì)抗,2007,30(3):37-39.
[2] 張澤潤(rùn).船舶導(dǎo)航雷達(dá)[M].北京:人民交通出版社,,1990.
[3] 樊世友,楊作賓.基于余輝模型的P型雷達(dá)顯示器計(jì)算機(jī)仿真[J].計(jì)算機(jī)仿真,2003,20(4):6-8.
[4] 劉翠海,溫東.光柵掃描顯示器上實(shí)現(xiàn)PPI雷達(dá)長(zhǎng)余輝仿真[J].計(jì)算機(jī)仿真,2002,19(2):25-27.
[5] RUEDA A J,ORTEGA L.Geometric algorithms on CUDA[J].GRAPP,,2008,,39(6):59-60.
[6] Wu Enhua,Liu Youquan.General purpose computation onGPU[J].Journal of Computer-aided Design & Computer Graphics,,2004,,16(5):601-611.
[7] 多相復(fù)雜系統(tǒng)國(guó)家重點(diǎn)實(shí)驗(yàn)室多尺度離散模擬項(xiàng)目組.基于多GPU的多尺度離散模擬并行計(jì)算[M].北京:科學(xué)出版社,2009.
[8] 吳恩華,,柳有權(quán).基于圖形處理器(GPU)的通用計(jì)算[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)報(bào),2004,,16(5):601-611.
[9] RANDINA F.GPU精粹——實(shí)時(shí)圖形編程的技術(shù),、技巧和技藝[M].姚勇,工小琴,,譯.北京:人民郵電出版社,,2006.
[10] 徐展翼,歐陽寧,,韓傳久.高速即工光柵掃描顯示系統(tǒng)坐標(biāo)轉(zhuǎn)換設(shè)計(jì)與實(shí)現(xiàn)[J].桂林電子工業(yè)學(xué)院學(xué)報(bào),,2003,23(1):14-18.
[11] 劉翠海,,王文清,,袁滿.一種支持雷達(dá)P顯仿真的實(shí)時(shí)坐標(biāo)變換策略[J].系統(tǒng)仿真學(xué)報(bào),2002,,14(9):57-60.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。