邱麗原,孫偉超
(海軍航空大學,山東煙臺 264001)
數(shù)字計算機仿真(以下簡稱為計算機仿真)以相似原理為基礎(chǔ),結(jié)合模型理論、系統(tǒng)技術(shù)、計算機技術(shù)、信息技術(shù)以及應(yīng)用領(lǐng)域的相關(guān)專業(yè)技術(shù)[1],在現(xiàn)代武器裝備的論證、設(shè)計、制造、試驗、定型、訓練,特別是對抗性驗證、評估中得到廣泛而深入的應(yīng)用,取得了很好的軍事效益和經(jīng)濟效益。
現(xiàn)代信息化戰(zhàn)爭的一個最顯著的特點就是電子戰(zhàn)的作用和地位日益突出,甚至可以說,電子戰(zhàn)水平和應(yīng)用能力的高低,在很大程度上決定了戰(zhàn)斗和戰(zhàn)役的勝負。雷達和針對雷達的電子對抗是電子戰(zhàn)中最主要的內(nèi)容和攻防矛盾之一,應(yīng)用計算機仿真對雷達/電子干擾攻防對抗進行研究非常必要。
雷達/電子干擾攻防對抗計算機仿真可以粗略分為功能級仿真和信號級仿真兩大類,在滿足了真實性要求的前提下,信號級仿真最突出的問題就是仿真速度的問題。在本文中,我們結(jié)合多年從事雷達/電子干擾攻防對抗信號級仿真的體會,就提高雷達/電子干擾攻防對抗信號級仿真的仿真速度的問題進行一些討論,主要包括以下內(nèi)容:
1) 信號級仿真的必要性;
2) 信號級仿真的速度問題及其解決出路;
3) 從仿真軟件本身找速度問題的解決出路。
關(guān)于什么是信號級仿真,什么是功能級仿真的問題,在國內(nèi)有不同的看法[1]。簡而言之,我們認為,對于相參雷達,能夠再現(xiàn)雷達內(nèi)部的零中頻及其以下的信號流動流程及其處理過程;對于非相參雷達,能夠再現(xiàn)雷達內(nèi)部的視頻及其以下的信號流動流程及其處理過程,就是信號級仿真。而功能級仿真,通常僅涉及空間能量計算以及一些基于概率計算的隨機變量門限檢測,而不涉及雷達內(nèi)部的信號流動流程及其處理過程。
從信號級仿真和功能級仿真的作用和實際效果看,在雷達/電子干擾攻防對抗仿真中,有以下區(qū)別。
1)客觀還是主觀的區(qū)別
信號級仿真要求把雷達本身真實地仿出來,把干擾機產(chǎn)生的干擾信號真實地仿出來,還要求把目標和環(huán)境也真實地仿出來。攻防對抗的結(jié)果,是通過運行仿真軟件來產(chǎn)生的,是客觀的。而功能級仿真在多個環(huán)節(jié)上都要有人的主觀參與和決策,特別是一些關(guān)鍵的結(jié)論性數(shù)據(jù),要由“專家”人為設(shè)定,因而有很強的主觀性。
2)能不能實現(xiàn)的區(qū)別
由于在信號流動流程及其處理過程的層面對雷達、干擾信號、目標信號和環(huán)境信號進行真實的仿真,在信號級仿真中,所有的干擾都可以加入雷達中。而在功能級仿真中,一些干擾是加不到雷達中的。換句話說,一些干擾在功能級仿真中不能實現(xiàn),因而是得不出結(jié)果的。特別是欺騙性干擾(一個典型的例子是距離波門拖引干擾),信噪比雖然是重要因素,但已經(jīng)不是決定性因素,決定性因素是目標回波信號、干擾信號在雷達組件中的相互作用以及雷達組件對信號的處理。對欺騙性干擾進行功能級仿真既沒有針對性,也沒有實際意義。
另外,除個別情況外,對于雷達/電子干擾攻防對抗中至關(guān)重要的目標識別,無法進行有意義的功能級仿真。
3)誤差與顛覆的區(qū)別
毋庸諱言,任何仿真都是有誤差的,信號級仿真也不例外。但功能級仿真與實際情況的差別在一些場合下是顛覆性的。以反艦導彈末制導雷達為例。反艦導彈末制導雷達在受到艦載有源壓制式干擾時,按照功能級仿真通常使用的信噪比準則,由于信噪比極低,在末制導雷達中已經(jīng)看不到目標回波,干擾是成功的。但實際情況是,在這種情況下,末制導雷達會啟動雜波源跟蹤(HOJ)功能,繼續(xù)在方位上跟蹤水面艦艇目標,引導反艦導彈準確命中,從而使得干擾徹底失敗。
綜上所述,我們認為,對于雷達/電子干擾攻防對抗而言,要進行客觀、全面、準確的研究,信號級仿真是非常必要的[2]。
相對于功能級仿真,信號級仿真有一些特別突出的問題,例如仿真速度問題,模型校核問題[3]等。在滿足了真實性要求的前提下,信號級仿真的一個最引人關(guān)注的問題就是仿真速度的問題。信號級仿真速度慢,主要原因在兩個方面:一是計算內(nèi)容多而且細致導致的計算量大;二是計算頻率高。以非相參雷達為例,系統(tǒng)采樣頻率需要達到20 MHz。這兩個方面的因素是由于信號級仿真本身的性質(zhì)決定的,是無法改變的。
信號級仿真的速度慢主要導致三個方面的問題:一是一次仿真要花費很長的時間,效率太低,同時也影響了仿真應(yīng)用者對重點問題的關(guān)注;二是極大地限制了信號級仿真在系統(tǒng)層面、體系層面上的應(yīng)用;三是不能用于任何有硬件參與的研究,包括模擬訓練等。
雖然計算量大、計算頻率高是信號級仿真的天然特性,但提高其仿真速度,使其達到實時或近實時(這里的近實時指的是:名義時間∶計算機時間<=1∶3)還是大有可為的。從通用的角度看問題,提高信號級仿真的速度有賴于在以下方面取得突破:
1)計算機硬件的整體速度有大幅度的提高;
2)計算機的多核并行處理能力有大幅度的提高;
3)通過輔助硬件加速使計算機系統(tǒng)的速度得到大幅度的提高;
4)使仿真軟件本身的運行速度得到大幅度的提高。
第一個方面,計算機硬件的整體速度,至少涉及CPU、內(nèi)存、主板等多個硬件(或硬件組件)的速度以及整合速度,這里主要拖后腿的是內(nèi)存(也涉及主板和總線)的存取速度。除非出現(xiàn)系統(tǒng)性的技術(shù)變革,要計算機硬件的整體速度有大幅度的提高是不現(xiàn)實的。
第二個方面,計算機的多核并行處理能力的大幅度提高,在今天已經(jīng)成為技術(shù)現(xiàn)實。多核并行處理能力的提高,通過多個實體仿真軟件(多枚反艦導彈同時攻擊水面艦艇目標情況下,每一枚反艦導彈的末制導雷達都是一個實體仿真軟件)的并行運行,可以提高整個仿真系統(tǒng)的運行速度,但對于構(gòu)成真正瓶頸的單個實體仿真軟件的速度提高則沒有意義。實際情況下,不大可能為了多核并行處理,把一個實體仿真軟件拆分成為多個部分。這里有三個問題:
1)能不能并行的問題
并行計算是需要條件的。或者說,并不是任何實體仿真軟件的任何部分都能夠任意地拆分來進行并行計算的。一個實體軟件的某些部分要能夠并行,必須滿足一定的時序、邏輯或計算關(guān)系。事實上,對于一個雷達的仿真軟件實體而言,能夠進行拆分進而進行并行計算的部分是非常有限的。
2)并行化改造的代價
無論是對一個已經(jīng)完成的實體仿真軟件進行拆分并行化改造,還是在設(shè)計、編制一個新的實體仿真軟件過程中貫徹并行化,都需要在較深的技術(shù)層次上付出較大的人力和時間代價。
3)并行化執(zhí)行的代價
在并行化執(zhí)行一個實體仿真軟件時,相應(yīng)的通信/控制、數(shù)據(jù)分配、數(shù)據(jù)合并和數(shù)據(jù)(包括程序)存取/傳輸?shù)?都是要付出時間代價的。特別是最后一個環(huán)節(jié),由于涉及的是不同核之間的數(shù)據(jù)/程序的傳輸和存取,會付出相當大的時間代價。
當并行化執(zhí)行的代價接近甚至高于并行化帶來的收益的時候,并行化就失去意義了。
由于上述三個問題的存在,要利用計算機的多核并行處理能力的大幅度的提高來提高單個實體仿真軟件的運行速度是沒有普遍意義的。
第三個方面,通過輔助硬件加速使計算機系統(tǒng)的速度得到大幅度的提高。通行做法有兩條途徑:一條途徑是采用FPGA或FPGA+DSP構(gòu)建專用的輔助硬件;一條途徑是采用GPU等通用輔助硬件。
采用FPGA或FPGA+DSP構(gòu)建的專用輔助硬件,的確能夠大幅度提高單個實體仿真軟件的運行速度,除了構(gòu)建專用輔助硬件需要付出的成本和人力/時間代價外,其最大缺點是靈活性差。
GPU從本質(zhì)上看是一種并行多核,而且其處理單元數(shù)比CPU中的核數(shù)高好幾個量級。除了上述的多核并行處理的三個問題外,GPU并行處理還有一個特殊的問題,就是其處理深度很淺,因而需要頻繁地交換數(shù)據(jù),在這個方面會付出更大的時間代價。有GPU方面的資深專家給出了一個例子[4],對于同一個問題(該問題比較復(fù)雜,具體內(nèi)容在此不擬贅述),采用程序優(yōu)化和GPU加速兩種方法,GPU加速方法的速度僅比程序優(yōu)化方法快一倍。我們認為,GPU加速的適用面受到很大的限制。
第四個方面,使仿真軟件本身的運行速度得到大幅度的提高,在下面作為一個專題,進行一定程度上的展開討論。
從理論和實踐兩個方面看,從仿真軟件本身找速度問題的解決出路,使仿真軟件本身的運行速度得到大幅度的提高,是大有可為的?;谖覀兊木唧w實踐,以下列出四條基本思路或者說是基本技術(shù)方法:
1)提高模型抽象和實現(xiàn)的層次和水平;
2)提高算法優(yōu)化的層次和水平;
3)提高以空間換時間的水平;
4)提高數(shù)據(jù)存取的速度水平。
提高模型抽象和實現(xiàn)的層次和水平,在一定意義上,對于提高仿真軟件的運行速度具有根本的、普遍的意義和作用。
系統(tǒng)仿真以模型為基礎(chǔ),在本質(zhì)上是模型試驗,仿真運行主要就是模型的運行。模型的有效性和精度決定了仿真的有效性和精度,模型也決定了仿真軟件運行的計算量。這里所說的通過提高模型抽象和實現(xiàn)的層次和水平來提高仿真軟件的運行速度,以保證模型的有效性和精度不下降為基本前提。
本文以目標回波的仿真為例闡述模型抽象的問題。這里僅考慮回波的時間位置和標準波形(與發(fā)射基帶波形相同的單位幅度的波形,這里采用簡單矩形脈沖)。
很多使用Matlab/Simulink進行仿真的人,在一開始的時候會用如圖1所示的模型一來實現(xiàn)目標回波的仿真。
圖1 回波仿真的模型一
圖1中的目標回波延遲時間根據(jù)目標與雷達之間的距離計算而得。
在圖1的模型中,目標回波由發(fā)射脈沖經(jīng)目標回波延遲時間的延遲得到,在物理概念上是完全正確和精確的。但圖1的模型的實現(xiàn)效率是非常低的:其中的可變時間延遲器(Variable Time Delay)模塊在內(nèi)部通過存儲器來存儲一個指定時間范圍內(nèi)的最新輸入數(shù)據(jù)。在每一個系統(tǒng)仿真步長(0.1 us量級)中,除了新數(shù)據(jù)輸入外,存儲器中的所有已有數(shù)據(jù)(數(shù)量在10 000量級,具體值與系統(tǒng)仿真步長和雷達的脈沖重復(fù)周期有關(guān))都要依次向后挪移一個存儲單元。由此使得僅僅是單個目標的回波的仿真就會消耗計算機的很多時間資源。
模型一效率低的主要原因是大量存儲器數(shù)據(jù)的高頻率的位移。分析后發(fā)現(xiàn),這種導致低效率的位移實際上是不必要的。對目標回波的生成過程進一步抽象后可知,發(fā)射脈沖的波形延遲可以用其發(fā)射后時間的延遲來替代,因而可以得到實現(xiàn)目標回波仿真的模型二,如圖2所示。
圖2 回波仿真的模型二
比較圖1和圖2可以看到,圖2中用重復(fù)序列產(chǎn)生器(Repeating Sequence)取代了圖1中的脈沖產(chǎn)生器Pulse Generator,而且沒有了可變時間延遲器。在圖2中,不再直接產(chǎn)生發(fā)射脈沖(概念上,發(fā)射脈沖還是要產(chǎn)生的),而是代之以產(chǎn)生以發(fā)射脈沖為起點的時間;再沒有通過發(fā)射脈沖的延遲來產(chǎn)生目標回波,而是直接用以發(fā)射脈沖為起點的時間與目標回波延遲時間進行比較,一旦達到目標回波延遲時間即產(chǎn)生目標回波。
理論分析和實際的仿真運行測試都表明,在相同輸入的條件下,上述的模型一、模型二的輸出完全相同。明顯不同的是,模型二的仿真速度幾乎是模型一的10倍。這還只是針對單目標的情況。在多目標的情況下,仿真運行測試表明,模型二的仿真速度優(yōu)勢更加突出:如果目標數(shù)為N,則模型二的仿真速度幾乎是模型一的10×N倍。
這個例子說明,提高模型抽象和實現(xiàn)的層次和水平對于提高仿真軟件的運行速度可以具有非常顯著的作用。
在科學技術(shù)的發(fā)展歷史上,通過算法優(yōu)化提高運行和處理速度的事例不勝枚舉。針對離散傅里葉變換DFT進行快速計算的快速傅里葉變換FFT是最著名的一個例子。FFT的發(fā)明為DFT的廣泛應(yīng)用創(chuàng)造了良好的條件。
針對不同的具體問題,算法優(yōu)化的具體方法可能千差萬別,但還是有一些共同的規(guī)律可以摸索和遵循。例如,已有計算結(jié)果的重用(重復(fù)使用)、避免數(shù)據(jù)的不必要的移動等。本文以在雷達信號級仿真中經(jīng)常會遇到的非相參脈沖滑窗積累(滑窗寬度設(shè)為M)的算法優(yōu)化為例來進行說明。
簡而言之,非相參脈沖滑窗積累就是對于雷達接收機在連續(xù)M個脈沖重復(fù)周期中的視頻輸出數(shù)據(jù)按距離單元相加,其基本原理如表1所示。
表1中,L表示一個脈沖重復(fù)周期中的距離單元數(shù),當前的脈沖重復(fù)周期編號為N+M-1,要與前面的編號直到N的各個脈沖重復(fù)周期(一共是M個脈沖重復(fù)周期)中的數(shù)據(jù)按距離單元相加。
表1 非相參脈沖滑窗積累原理示意表(按距離單元進行M個脈沖重復(fù)周期的數(shù)據(jù)相加)
由表1所示的非相參脈沖滑窗積累原理可知,如果直接實施非相參脈沖滑窗積累,在每一個脈沖重復(fù)周期,對于每一個距離單元,M個數(shù)據(jù)相加,需要進行M-1次加法。
進一步分析可知,以距離單元K為例,在一個脈沖重復(fù)周期進行相加的M個數(shù)據(jù)(相加結(jié)果記做SN+M-1,K)中,前M-1個數(shù)據(jù)的相加在上一個脈沖重復(fù)周期中已經(jīng)完成,僅需從上一個脈沖重復(fù)周期的積累數(shù)據(jù)(SN+M-2,K)中剔除(減去)最早的脈沖重復(fù)周期的數(shù)據(jù)DN-1,K即可得到;再加上本脈沖重復(fù)周期中的新數(shù)據(jù)DN+M-1,K即得到完整的SN+M-1,K。換句話說,對于滑窗寬度為M的非相參脈沖滑窗積累,在每一個脈沖重復(fù)周期,對于每一個距離單元,僅需進行1次加法和1次減法(以下簡稱為1+1算法),而無須進行M-1次加法。顯然,這種1+1算法的效率明顯高于要進行M-1次加法的直接算法?;皩挾仍綄?1+1算法的效率提高越顯著。
以下給出一次完成一個脈沖重復(fù)周期中所有距離單元的非相參脈沖滑窗積累的1+1算法的Matlab程序。
程序中用到以下變量:
aIQinput:存儲當前PRI(PRI為脈沖重復(fù)周期)輸入的正交雙通道復(fù)數(shù)數(shù)據(jù)的數(shù)組(行數(shù)組,數(shù)組元素對應(yīng)于距離單元,以下除I-Row外類似);
aTempAbs:存儲當前PRI的要進行非相參積累的視頻數(shù)據(jù)的數(shù)組;
aIntegrationData:存儲當前PRI的非相參積累結(jié)果數(shù)據(jù)的數(shù)組;
aStoreCD:存儲當前滑窗中輸入視頻數(shù)據(jù)的數(shù)組;
I-Row:aStoreCD的行指針;
Width-SW:滑窗寬度M。
除初始化部分外,1+1算法的Matlab程序中僅需要以下四條中的后三條語句:
1)aTempAbs=abs(aIQinput);
2)I-Row=mod(I-Row,Width-SW)+1;
3)aIntegrationData=aIntegrationData+aTempAbs-aStoreCD(I-Row,:);
4)aStoreCD(I-Row,:)=aTempAbs;
第1)條語句的作用是由當前PRI的正交雙通道復(fù)數(shù)數(shù)據(jù)aIQinput得到要進行非相參積累的當前PRI的視頻數(shù)據(jù)aTempAbs。顯然,該語句不屬于1+1算法。
第2)條語句的作用是行指針I(yè)-Row以滑窗寬度Width-SW取模后加1,以循環(huán)指向aStoreCD中最早的脈沖重復(fù)周期的輸入視頻數(shù)據(jù),該數(shù)據(jù)在本次積累中應(yīng)該剔除。
第3)條語句的作用是具體實施1+1算法,得到當前PRI的非相參積累結(jié)果數(shù)據(jù)。
第4)條語句的作用是以當前PRI的新數(shù)據(jù)更新(替換)存儲aStoreCD中當前被剔除的舊數(shù)據(jù)。
在上述程序中,通過1+1算法,在最大的程度上做到了已有計算結(jié)果的重用;通過aStoreCD數(shù)組和I-Row指針的應(yīng)用,避免了數(shù)據(jù)的移動。通過這樣的算法優(yōu)化,有效地提高了仿真軟件運行的速度。
狹義地講,以空間換時間就是以計算機的存儲空間資源換取計算機的時間資源,提高計算機的運行速度。以空間換時間的最簡單也是非常有效的例子之一就是通過查表法來避免復(fù)雜計算,直接得到相關(guān)數(shù)據(jù)結(jié)果。下面以FFT為例進行說明和討論。
對于sin()等連續(xù)函數(shù)的數(shù)值計算[5],最容易想到的是采用泰勒級數(shù)。對于sin(x),有
取上式的前三項(5次多項式)來近似計算sin(x),得到
在|x|≤1的范圍內(nèi),P5(x)的誤差小于1/7!≈2×10-4。按照高效的多項式計算的秦九韶算法,計算一次P5(x),需要進行5次加法和5次乘法。
除了泰勒級數(shù)外,對于sin()等連續(xù)函數(shù)的數(shù)值計算,用得更多的是精度更好、計算效率更高的切比雪夫插值法。對于sin(x),其切比雪夫插值法近似為
sin(x)≈-1.2 850 635×10-3x6+0.0 121 117x5-6.0 244 134×10-3x4-0.16 137 988x3-2.357 414×10-3x2+1.0 004 218x-1.32 648×10-5
在0≤x≤π的范圍內(nèi),上式的誤差小于1.5×10-5。
用秦九韶算法,按上式計算一次sin(x),需要6次加法和6次乘法。以下關(guān)于計算量的計算以采用切比雪夫插值法的秦九韶算法為準。
一個復(fù)指數(shù)冪數(shù)據(jù)的計算包括二個sin()的計算(一個sin()和一個cos()),每個sin()的計算需要6次加法和6次乘法,粗略認為兩次實數(shù)乘法和加法分別與一次復(fù)數(shù)乘法和加法相當,則一個復(fù)指數(shù)冪數(shù)據(jù)的計算需要6次復(fù)數(shù)乘法和6次復(fù)數(shù)加法。
眾所周知,對于N點(N為2的整數(shù)次冪)FFT,其復(fù)數(shù)乘法和加法的次數(shù)都是Nlog2N。關(guān)于復(fù)指數(shù)冪數(shù)據(jù)的計算量可以有兩種不同的衡量方法。
第一種方法:FFT中的復(fù)數(shù)乘法實際就是輸入信號數(shù)據(jù)等與復(fù)指數(shù)冪數(shù)據(jù)的相乘。N點FFT中,Nlog2N次復(fù)數(shù)乘法要計算Nlog2N次復(fù)指數(shù)冪數(shù)據(jù),而計算Nlog2N次復(fù)指數(shù)冪數(shù)據(jù)的計算量為6Nlog2N次復(fù)數(shù)乘法和加法,是FFT算法本身計算量的6倍。
第二種方法:N點FFT中需要用到的復(fù)指數(shù)冪數(shù)據(jù)僅為N個。這N個數(shù)據(jù)中,有的會多次用到。如果一個復(fù)指數(shù)冪數(shù)據(jù)計算后即存儲保留,在需要的時候再重用,則N點FFT中,復(fù)指數(shù)冪數(shù)據(jù)的計算量為N×6次復(fù)數(shù)乘法和N×6次復(fù)數(shù)加法。換句話說,對于64點(log264=6)以下的FFT計算,復(fù)指數(shù)冪數(shù)據(jù)的計算量超過了FFT算法本身的計算量。FFT的點數(shù)越少,復(fù)指數(shù)冪數(shù)據(jù)的計算量的比重越大。
當FFT的點數(shù)N給定后,其所需要的N個復(fù)指數(shù)冪數(shù)據(jù)就是固定的了,可以在仿真程序外進行計算(線下計算),然后存入一個小數(shù)據(jù)表中。仿真軟件運行過程中,在需要的時候通過查表讀入復(fù)指數(shù)冪數(shù)據(jù),相應(yīng)的時間消耗可以忽略不計。上面的討論表明,相對于線上計算,采用查表的方法獲取復(fù)指數(shù)冪數(shù)據(jù),對第一種方法,無論FFT的點數(shù)多少,計算速度可以提高6倍;對第二種方法,對于64點的FFT,計算速度可以提高1倍;對于32點的FFT,計算速度可以提高1.2倍;對于16點的FFT,計算速度可以提高1.5倍。
信號級的雷達/電子干擾攻防對抗仿真軟件在目前的計算機(指PC機,以下同)上要提高運行速度,一條大有潛力的技術(shù)途徑是提高數(shù)據(jù)存取的速度。
信號級的雷達/電子干擾攻防對抗仿真軟件在目前的計算機上運行時,人們感覺運行緩慢,這是一種整體感覺。事實上,真正緩慢的、或者說成為仿真軟件整體速度瓶頸的是計算機中的存儲器(指內(nèi)存,以下同)及其相關(guān)部件。因為很久以來,CPU的運行速度已經(jīng)達到了存儲器存取速度的100倍以上[6]。容易想到,如果能夠提高存儲器存取速度使其達到CPU的運行速度,僅此一條就可以大幅度提高仿真軟件的運行速度,使信號級的雷達/電子干擾攻防對抗仿真軟件的運行速度達到實時。但令人遺憾的是,全面、大幅度提高存儲器的速度在目前以及可以預(yù)見到的將來都是做不到的,只能采取Cache等折中的辦法。
Cache被稱作緩沖存儲器,其特點是速度快(比內(nèi)存快10倍以上)但容量小。因其容量小,產(chǎn)生了命中率的概念。Cache的命中率定義為CPU需要的信息已經(jīng)存在于Cache中的比率。顯然,只有當CPU需要的信息已經(jīng)存在于Cache中時,才能發(fā)揮Cache速度快的優(yōu)勢,真正提高仿真軟件的運行速度。因此,提高Cache的命中率對于提高仿真軟件的運行速度可以起到直接的、顯著的作用。
Cache命中率的提高涉及多方面的因素,但數(shù)據(jù)/程序是否存入Cache在根本上遵循所謂的局部性原理[6]:在訪問完一個內(nèi)存區(qū)域后,程序會在不久的將來(時間局部性)訪問鄰近的區(qū)域(空間局部性)。
Cache的局部性原理可以在不同的層次、從不同的角度加以利用,以提高Cache的命中率。這里以Matlab中矩陣數(shù)據(jù)的存儲和應(yīng)用為例,來闡述和討論一些典型問題。
眾所周知,在Matlab的m語言中,矩陣數(shù)據(jù)是按列存儲的。這就意味著,如果在組織矩陣數(shù)據(jù)的時候,把相關(guān)的數(shù)據(jù)組織到相同的列中去,在處理的時候也按列進行處理,將獲得(相對于按行組織數(shù)據(jù)和按行處理)更快的處理速度。以下舉例說明[7]。
問題:對于512×512的矩陣A,生成一個矩陣B,其元素按下式取值
對于本問題,可以用多種方法來求解。這里采用兩種方法,分別對應(yīng)于函數(shù)ForLoopCompare1(x)和ForLoopCompare2(x)。
方法一:
functiony=ForLoopCompare1(x)
y(512,512)=0;
tic;
fori=2∶511
forj=2∶511
fork1=-1∶1
fork2=-1∶1
y(i,j)=y(i,j)+x(i+k1,j+k2)/9;
end
end
end
end
toc
方法二:
functiony=ForLoopCompare2(x)
y(512,512)=0;
tic;
fork2=-1∶1
fork1=-1∶1
forj=2∶511
fori=2∶511
y(i,j)=y(i,j)+x(i+k1,j+k2)/9;
end
end
end
end
toc
下面,在相同的環(huán)境和相同的輸入條件下比較兩種方法的運行效率。
X=rand(512);
Y1=ForLoopCompare1(x);Elapsed time is 0.330648 seconds.
Y2=ForLoopCompare2(x);Elapsed time is 0.057423 seconds.
上述例子表明,對于同一個問題,Cache利用的差異可以導致接近6倍的速度差異。
在方法一的函數(shù)ForLoopCompare1(x)中,次數(shù)多的循環(huán)i、j放在外層,而且是按行的順序從矩陣A(即x)中讀取數(shù)據(jù)。按這樣的方法,Cache基本不能發(fā)揮作用:對于每一個i、j和k1,k2=-1時取出的數(shù)據(jù)為x(i+k1,j-1),下一個要取出的數(shù)據(jù)為x(i+k1,j),再下一個要取出的數(shù)據(jù)是x(i+k1,j+1),各個數(shù)據(jù)在內(nèi)存中的存儲地址相差512×8字節(jié)(數(shù)據(jù)按double類型存儲),第一個數(shù)據(jù)與第三個數(shù)據(jù)在內(nèi)存中的存儲地址相差8k字節(jié),考慮到L1Cache和L2Cache的容量非常有限,這些要相繼取出的數(shù)據(jù)是不可能同時被放入Cache中的。也就是說,這些數(shù)據(jù)只能從內(nèi)存中讀取,從而導致程序的運行速度低下。
在方法二的函數(shù)ForLoopCompare2(x)中,次數(shù)多的循環(huán)i、j放在內(nèi)層,而且是按列的順序從矩陣A(即x)中讀取數(shù)據(jù)。按這樣的方法,Cache的作用可以得到很好的發(fā)揮:對于每一個k2、k1和j,在i從2循環(huán)到511的過程中需要相繼取出的509個數(shù)據(jù)在內(nèi)存中是連續(xù)存放的;不僅如此,在k2、k1或j變化前后需要相繼取出的數(shù)據(jù)在內(nèi)存中也基本上是連續(xù)存放的,這就保證了Cache的極高的命中率,從而使得程序的運行速度得到很大的提高。
對于雷達/電子干擾攻防對抗信號級仿真,提高仿真軟件的運行速度具有非常重要的意義?;诩夹g(shù)分析和多年的實踐經(jīng)驗,我們認為,在當今的技術(shù)條件下,針對仿真軟件本身挖掘潛力,對于提高速度仍然是大有可為的。以我們的親身經(jīng)歷為例,我們研制了一個信號級的艦載多功能相控陣雷達仿真軟件,最初的運行速度為1∶80,采取多種方法改進后,在原有功能不變,技術(shù)性能還有所提高的情況下,在相同的硬件環(huán)境中,使該仿真軟件的運行速度提高近20倍,達到1∶4左右。所采取的方法就是上述的模型抽象、算法優(yōu)化、以數(shù)據(jù)表格替換復(fù)雜計算、提高Cache命中率等。我們希望并相信,經(jīng)過更加深入的艱苦努力,在國內(nèi)同行的支持和共同參與下,雷達/電子干擾攻防對抗信號級仿真以及其他領(lǐng)域中具有計算量大和計算頻率高特點的信號級仿真,在運行速度方面,能夠有進一步的顯著提高,從而使得信號級仿真在應(yīng)用廣度上得到大幅度的擴展,包括應(yīng)用于系統(tǒng)層面、體系層面上的仿真,應(yīng)用于有硬件參與的研究,如模擬訓練等。