相關(guān)鏈接: 中國安全網(wǎng) 中國質(zhì)量網(wǎng) 中國論文網(wǎng) 中國資訊網(wǎng)
韓秉君 ,黃詩銘 ,杜 瀅
(1.中國信息通信研究院北京100191;2.北京郵電大學北京100876)
摘 要:提出了一種在Kepler架構(gòu)GPU(graphics processing unit,圖形處理器)上利用CUDA( compute unifieddevice architecture,統(tǒng)一計算設(shè)備架構(gòu))技術(shù)加速通信仿真中DFT(discrete Fourier transform,離散傅里葉變換)處理過程的方法。該方法的核心思想是利用線程級并行技術(shù)實現(xiàn)單條收發(fā)鏈路內(nèi)部DFT運算的并行加速,并利用動態(tài)并行和Hyper-Q技術(shù)實現(xiàn)不同收發(fā)用戶對之間鏈路處理過程的并行加速,從而最終達到加速仿真中DFT處理過程的目的。實驗結(jié)果表明,相對單核單線程CPU程序和上一代Ferml架構(gòu)GPU程序,該方法分別能夠?qū)FT處理速度提升300倍和3倍,具有較好的加速效果。
1 引言
隨著通信領(lǐng)域的研究開始從4G技術(shù)向SG技術(shù)過渡,以大規(guī)模多天線陣列、超密集網(wǎng)絡(luò)以及大帶寬毫米波通信等為代表的一系列技術(shù)成為未來研究的重點。這些技術(shù)從天線數(shù)、用戶數(shù)、總帶寬和復(fù)雜度等維度將系統(tǒng)級仿真的總體運算量提升了1~3個數(shù)量級,進而給系統(tǒng)級仿真平臺的搭建工作帶來巨大挑戰(zhàn)。
在計算量大增的情況下,為了使仿真總時間仍能被控制在可接受的范圍內(nèi),仿真加速技術(shù)也成為未來構(gòu)建系統(tǒng)級仿真平臺的必選技術(shù)。傳統(tǒng)仿真過程的總體運算量不大,采用加速技術(shù)的仿真平臺往往僅能節(jié)省數(shù)小時至數(shù)天的運算時間,卻要在硬件購置、代碼開發(fā)、測試校準以及平臺升級等方面花費更多時間和成本,總體來看收益有限;而在4G到5G的過渡時代,隨著系統(tǒng)級仿真總體運算量的增大,采用加速技術(shù)的仿真平臺有可能節(jié)約數(shù)周甚至數(shù)月的仿真時間,從而保證在總體運算量大增的情況下依舊能將仿真時間控制在可接受的范圍內(nèi),具有較高的應(yīng)用價值。
通常情況下,通信仿真中存在大量可并行處理的雙精度浮點運算,非常適合采用GPU (graphics processing unit,圖形處理器)進行加速。而CUDA (compute unified devicearchitecture,統(tǒng)一計算設(shè)備架構(gòu))作為一種能夠均衡硬件設(shè)備成本、開發(fā)維護成本和運行能耗成本的GPU并行計算架構(gòu),為通信系統(tǒng)級仿真加速提供了一種理想的技術(shù)手段。CUDA程序采用類C++語言開發(fā),其最新版開發(fā)工具CUDA Toolkit 7.5已經(jīng)針對主流開發(fā)環(huán)境如Visual Studio2013實現(xiàn)較好整合,并針對目前主流的Kepler架構(gòu)GPU提供了動態(tài)并行、Hyper-Q、統(tǒng)一內(nèi)存尋址、CuBLAS和CuFFT等一系列編程工具和函數(shù)庫,顯著降低了代碼開發(fā)和維護的工作量。
目前,關(guān)于使用GPU加速通信仿真平臺問題,一些文章從通信模塊加速和GPU加速關(guān)鍵技術(shù)兩方面提供了具有參考性的研究結(jié)果:在通信模塊加速上,一種針對多徑信道的GPU加速方法,參考文獻[4]提出了一種針對OFDM系統(tǒng)蒙特卡羅仿真的GPU加速方法,一種針對LDPC (low density paritycheck code.低密度奇偶校驗碼)編碼處理的加速方法,一種利用英偉達公司GPU加速FFT處理模塊的方法;在GPU加速關(guān)鍵技術(shù)上。
然而,GPU硬件和軟件能力在近兩年取得了長足進展,而目前尚未有關(guān)于如何利用這些進展加速系統(tǒng)級仿真平臺的研究。因此,本文提出了一種在Kepler架構(gòu)顯卡下利用CUDA技術(shù)加速通信仿真中信道DFT (discreteFourier transform,離散傅里葉變換)處理過程的方法。該方法的主要創(chuàng)新點是以接收用戶為依據(jù),將整個仿真中相互交錯的通信鏈路拆解成一系列獨立的“多發(fā)送用戶到單接收用戶”接收束,并基于這些接收束將DFT計算量分解為對同步和數(shù)據(jù)交互要求低、易于并行處理的子任務(wù)。最后,該方法一方面利用動態(tài)并行技術(shù)實現(xiàn)對不同接收束不同鏈路計算任務(wù)的并行處理,另一方面利用線程并行技術(shù)實現(xiàn)了對同一鏈路內(nèi)不同采樣點的DFT計算任務(wù)的并行處理,在控制開發(fā)復(fù)雜度的前提下達到較好的并行加速效果。
2通信鏈路與并行任務(wù)模型
本節(jié)主要介紹了用于加速系統(tǒng)級仿真DFT過程的邏輯模型。該邏輯模型的核心是將收發(fā)設(shè)備之間彼此交錯的信道拆分成便于函數(shù)級并行處理的接收束結(jié)構(gòu)和便于線程級并行處理的天線一頻點陣狀結(jié)構(gòu),從而可以綜合利用不同粒度并行技術(shù)達到較理想的加速效果。
2.1 接收束與分子級并行任務(wù)
一般說來,系統(tǒng)級仿真過程中的信道關(guān)系可以抽象為發(fā)送設(shè)備、接收設(shè)備以及發(fā)送和接收設(shè)備之間的通信鏈路,如圖1所示。
圖1中,TE,,TE2,…,TEn表示n個發(fā)送設(shè)備,RE1,RE2,…,REm表示m個接收設(shè)備,Lij表示TEi到REi的通信鏈路。在仿真中,不同收發(fā)設(shè)備間的通信鏈路處理過程通常是相互獨立的,可以并行進行;而對于某一接收設(shè)備如RE1,則需要完整收集與其相連的所有通信鏈路L1,L2,L3,…Ln的處理結(jié)果后,才能繼續(xù)分析該設(shè)備的接收性能;谝陨戏治,本文從邏輯上提出了一種接收束結(jié)構(gòu),如圖2所示。
圖2中,從接收用戶角度將圖1中彼此交錯的通信鏈路分為m個接收束。其中,每個接收束包含n個發(fā)送機、1個接收機以及它們之間的n條通信鏈路。在實際仿真過程中,因為調(diào)度等原因,在不同仿真時刻,一個接收束內(nèi)處于發(fā)送狀態(tài)的發(fā)射機可能是不同的,這要求處理接收束內(nèi)不同鏈路的并行機制應(yīng)具備足夠彈性,以適應(yīng)子任務(wù)規(guī)模的動態(tài)變化。考慮到接收束中每一條通信鏈路上的處理任務(wù)還可以繼續(xù)拆分為更小的可并行子任務(wù),因此將每條鏈路的處理任務(wù)稱為分子級子任務(wù)。按照束狀結(jié)構(gòu)進行拆分后,不同鏈路上的分子級子任務(wù)所需的輸入數(shù)據(jù)往往是相互獨立的,不同分子級子任務(wù)的處理過程也不涉及數(shù)據(jù)共享和交互。這意味著并行處理這些分子級子任務(wù)時可以節(jié)約因數(shù)據(jù)共享和同步而造成的時間開銷,以達到更好的加速效果。
2.2天線一頻點與原子級并行任務(wù)
對于信道束Bi其中某一鏈路Li上的處理任務(wù)又可以從邏輯上進一步拆解成圖3所示的多條子徑上的處理任務(wù)。圖3中,A T1,AT2…,ATp為發(fā)送設(shè)備TEi的p個發(fā)送天線,AR,1,ARj2,…,ARjq表示接收設(shè)備REi的q個接收天線。第r個發(fā)送天線ATi到第s個接收天線ARjs之間的子徑用Pj表示。
在仿真過程中,仿真平臺會根據(jù)信道模型生成某一子徑Pjis的時域離散采樣點。這些時域離散采樣點通常需要利用離散傅里葉變換轉(zhuǎn)為頻域采樣值后才能繼續(xù)進行下一步處理。DFT的計算式為:
其中,x[n]是時域上的N個采樣點,X [k]為轉(zhuǎn)化后的頻域上的采樣值。根據(jù)歐拉公式,可以得到:
從式(3)可以看出,無論是不同子徑上的X[k],還是同一子徑上不同采樣點的X [k],其計算過程都是彼此無關(guān)的,這意味著并行進行不同[k]計算時不會涉及數(shù)據(jù)共享和同步問題,能夠簡化代碼開發(fā)難度并節(jié)省較多的時間開銷。每一個[k]的計算過程很難進行更細的拆分,因此將其稱為原子級子任務(wù)。
3 不同子任務(wù)的CUDA處理
本節(jié)提出了一種基于Kepler架構(gòu)GPU的DFT并行加速方法。具體而言,該方法首先利用線程級并行來加速某一通信鏈路內(nèi)不同子徑及不同頻域采樣點的DFT計算,又利用動態(tài)并行技術(shù)將以上不同通信鏈路的DFT處理過程進一步并行,以提高加速效果。
3.1 天線一子載波的線程級并行處理
線程是CUDA程序處理一個任務(wù)的最基本單元,CUDA程序通過啟用多個線程并行處理一個大任務(wù)中的不同部分,以實現(xiàn)加速效果。CUDA的線程通過grid、block和thread 3個級別進行組織,每個線程都可以通過其所在的3級組織編號得到自己唯一的線程編號,該編號可以是一維、二維或三維的。CUDA加速的核心原理是將一個計算任務(wù)分解成若干個子任務(wù),并根據(jù)線程編號設(shè)計每個線程和子任務(wù)的對應(yīng)關(guān)系。程序執(zhí)行過程中會根據(jù)任務(wù)需要啟動合適數(shù)量的線程,這些線程根據(jù)其線程編號和預(yù)設(shè)對應(yīng)關(guān)系自動并行處理其所對應(yīng)的子任務(wù),以達到加速效果。
因此,將任務(wù)分解并建立線程和分解后子任務(wù)的關(guān)系,是使用CUDA加速的最核心問題。對于第2.2節(jié)描述的某一通信鏈路的DFT處理過程,由于其不同子徑和不同采樣點的DFT形式均相同,每一采樣點的求取過程運算量不大,且很難再進一步分解成可以并行執(zhí)行的子任務(wù),因此非常適合采用線程級并行加速。
以圖3中通信鏈路為例,圖3中發(fā)射天線有p個,接收天線有q個,假設(shè)每個子徑有v個頻域采樣點需要求取,則該通信鏈路共需要進行pxqxv次DFT運算,這些DFT運算之間沒有相關(guān)性,可以并行處理。因此,啟動p Xq Xv個線程來一次性并行處理這些DFT運算,其線程號與任務(wù)映射關(guān)系如圖4所示。
圖4中每一矩形均表示某一個線程與其所承擔DFT子任務(wù)之間的對應(yīng)關(guān)系,矩形中深色部分為該線程的線程編號,采用二維編號體系,形式為(Idx_x,Idx_y);淺色部分表示該線程所承擔DFT子任務(wù)的三維索引,形式為(NAT,NAR,Nk),其3個維度分別代表發(fā)送天線號、接收天線號以及頻域采樣點號,表示線程號為(Idx_x,Idx_y)的線程負責處理第AT個發(fā)送天線與第AR個接收天線之間第k個頻域采樣點上的DFT運算。其中線程編號和子任務(wù)之間的關(guān)系如式(4)所示。
按照式(4)所述的邏輯,一共啟用pxq xv個線程來并行處理對應(yīng)的pxqxv個DFT運算。圖4中根據(jù)線程編號將不同線程排列成一個矩形陣列。處于同一行的線程表明其處理的是同一子徑上不同頻域采樣點的DFT,前g行的線程表明其處理的是第1個發(fā)射天線到所有q個接收天線之間子徑的DFT,即圖3中Pi,1j,1,Pi,1j,2…,Pjjql子徑的DFT。以此類推,第pxq行表示處理的是第p個發(fā)送天線到第q個接收天線的DFT任務(wù),即圖3中Pi,pj,n子徑。
在進行DFT任務(wù)并行處理過程中,有幾個原則需要進一步解釋:首先,盡管CUDA支持對線程的三維編號,本部分依然將收發(fā)天線壓縮成一維,主要是考慮經(jīng)過如此方式壓縮后,輸入輸出數(shù)據(jù)都可以比較方便地采用二維矩陣存儲,后繼處理也可以利用MKL、CuBLAS等矩陣運算工具,可以降低開發(fā)難度;第二,沒有使用快速傅里葉變換(FFT)算法,主要是考慮在系統(tǒng)級仿真過程中,每一個子徑的時域采樣點數(shù)目通常不大,一般為20~30個,而仿真最終需要用的頻域采樣點數(shù)目也不確定,典型的20 Mbit/s帶寬的LTE系統(tǒng)可能有50~1 200個采樣點,因此采用DFT實現(xiàn)會更靈活一些。
3.2不同收發(fā)鏈路的函數(shù)級并行
如圖5所示,在Kepler架構(gòu)下,CUDA提供了全新的動態(tài)并行和Hyper-Q技術(shù),從而使CUDA程序能夠更加便利地實現(xiàn)多個GPU函數(shù)之間的并行。關(guān)于動態(tài)并行,傳統(tǒng)的CUDA程序只支持由CPU函數(shù)啟動GPU函數(shù),而在Kepler架構(gòu)顯卡下,動態(tài)并行技術(shù)允許一個GPU函數(shù)啟動另一個GPU函數(shù),該技術(shù)減少了CPU和GPU之間不必要的信息交互,在簡化編程代碼復(fù)雜度的同時提升了程序的效率。關(guān)于Hyper-Q,當使用流的形式在CPU和GPU之間復(fù)制數(shù)據(jù)時,傳統(tǒng)架構(gòu)顯卡中不同流之間的數(shù)據(jù)要在硬件隊列中排隊,而Hyper-Q允許GPU能夠同時并發(fā)執(zhí)行最多32個活動的任務(wù),并且增加了硬件隊列的數(shù)量,從而極大提升了數(shù)據(jù)復(fù)制效率和程序的運行速度。
由以上描述可以看出,動態(tài)并行和Hyper-Q技術(shù)能夠根據(jù)任務(wù)量在顯卡中啟動相應(yīng)數(shù)量的函數(shù),并能夠較為便捷地進行CPU/CPU之間數(shù)據(jù)交互,非常適合第2.1節(jié)提出的數(shù)目不定的不同通信鏈路的處理過程。因此,提出了如圖6所示的分子級任務(wù)并行方案。圖6中,所有接收束被分成了多個批次。首先,第一批接收束的輸入?yún)?shù)借助多個流傳人GPU中;第二,GPU通過動態(tài)并行技術(shù),并行執(zhí)行第一批接收束中的所有通信鏈路的DFT運算,其中每個通信鏈路的DFT處理過程如第3.1節(jié)所述;第三,通過多流技術(shù),將處理結(jié)果傳回CPU中;最后,重復(fù)以上步驟,直到所有批次的接收束都處理完成為止。
關(guān)于接收束的并行加速方案,有如下幾個細節(jié)需要特別解釋:首先,并行方案中之所以對接收束分批次處理,主要是因為實際測試表明,當一次并行的任務(wù)量過大時,GPU函數(shù)的處理效率會變得極低,從而拉長仿真時間。而采用分批處理,能夠規(guī)避這一問題。此外,進行多批次處理,也有利于將處理后的結(jié)果及時傳回,從而使CPU在GPU處理下一批接收束時能夠同步處理本次返回的接收束結(jié)果。第二,仿真中采用多流的原因是:實際測試表明,通過多個流的復(fù)用可以顯著節(jié)省程序中的數(shù)據(jù)復(fù)制時間。
4加速結(jié)果與分析
本節(jié)參照典型的19小區(qū)/57扇區(qū)20 Mbit/s帶寬LTE下行鏈路提出了如下仿真參數(shù),見表1。
需要強調(diào)的是,傳統(tǒng)的仿真平臺為了節(jié)省仿真時間,對通信鏈路的處理過程進行了簡化,而本實驗過程假設(shè)所有通信鏈路都進行DFT處理,并以此為基礎(chǔ)研究運算總量、每批次處理數(shù)量以及所用流數(shù)目對總仿真時間的影響。
首先,對比了采用CPU、Fermi架構(gòu)GPU以及Kepler架構(gòu)GPU處理系統(tǒng)全部57x570x4x2x50≈1 300萬次DFT運算的總時間,見表2。表2中的CPU運算時間是在單核單線程條件下得到的,多核CPU運算時間近似為該時間/核數(shù)。從表2中數(shù)據(jù)可以看出,本文所提出的加速方法相對于CPU大約加速300倍,相對于上一代Fermi架構(gòu)GPU大約加速3倍。此外,考慮到本文所提方法代碼實現(xiàn)更簡單,因此在實際應(yīng)用過程中還能進一步節(jié)省開發(fā)、測試和維護時間。
第二,研究了本文所提算法的加速效果和總體運算量的關(guān)系,如圖7所示?梢钥闯,隨著運算總量的增加,GPU運算總時間近似呈線性增長;在運算量較大的情況下,進行單位次數(shù)DFT運算的時間更小,其原因主要是加速過程中CPU-GPU間的數(shù)據(jù)復(fù)制、CPU線程管理等相對固定的時間開銷在大計算量情況下得到了“分攤”,這也說明本文所提出的加速方法在運算量較大的情況下加速效果會更明顯。
第三,研究了1 200個采樣點條件下加速效果和處理批次的關(guān)系,如圖8所示?梢钥闯觯绻捎脝闻翁幚,GPU處理完全部DFT運算大約耗時7.8 s,而改為8批次處理后,耗時降為大約1.2 s,兩者相差6倍以上。該研究結(jié)果說明在使用CUDA技術(shù)加速通信仿真平臺時,應(yīng)將每次交給GPU的計算任務(wù)控制在合適范圍內(nèi),否則可能會影響最終的加速效果。
最后,研究了加速效果和輸入輸出流數(shù)目的關(guān)系,如圖9所示。可以看出,隨著輸入輸出流數(shù)目的增加,運算時間呈現(xiàn)出明顯的遞減趨勢。當流數(shù)超過16時,仿真時間基本穩(wěn)定。該研究結(jié)果說明輸入輸出流的數(shù)目會對加速效果構(gòu)成較大影響,應(yīng)盡量選擇盡可能多的流進行輸入輸出,以避免數(shù)據(jù)傳輸成為加速瓶頸。
5結(jié)束語
本文提出了一種基于Kepler架構(gòu)CPU的系統(tǒng)級仿真DFT加速方法。該方法利用動態(tài)并行和Hyper-Q等技術(shù),使DFT處理過程相對于單核單線程CPU程序加速300倍,具有較好的應(yīng)用價值。此外,該方法中提出的從接收用戶角度將加速任務(wù)分為多個接收束的思想,對于處理DFT之外的加速任務(wù)同樣有著重要的參考意義。
總之,該方法為解決仿真時間隨計算量增加而惡性膨脹的“仿真時間瓶頸”問題提供了切實可行的應(yīng)對方向及技術(shù)手段,是保證4G/5G大規(guī)模仿真預(yù)研工作順利開展的基礎(chǔ)性技術(shù)。未來將基于接收束的思想,研究如何利用CUDA技術(shù)加速通信仿真中接收機信噪比計算的方法以及基于迭代容器的更加靈活的CPU、GPU接口,以構(gòu)造更易用的通信仿真基礎(chǔ)模塊。