徐啟迪,劉爭(zhēng)紅,鄭 霖
(廣西無(wú)線寬帶通信與信號(hào)處理重點(diǎn)實(shí)驗(yàn)室(桂林電子科技大學(xué)),廣西 桂林 541004)
軟件無(wú)線電就是采用軟件的方式來(lái)實(shí)現(xiàn)無(wú)線通信系統(tǒng)中的各種功能,是繼無(wú)線通信技術(shù)從模擬制式過(guò)渡到數(shù)字后的又一次革命性的飛躍。目前,存在有多種主流的軟件定義無(wú)線電(Software Defined Radio,SDR)硬件平臺(tái)結(jié)構(gòu)。基于現(xiàn)場(chǎng)可編程邏輯門(mén)陣列(Field Programmable Gate Array,F(xiàn)PGA)架構(gòu)的SDR 結(jié)構(gòu)由中心處理器進(jìn)行全部資源調(diào)配和邏輯控制,由FPGA 完成計(jì)算量較大的基帶信號(hào)處理,其架構(gòu)特點(diǎn)傾向于多指令單數(shù)據(jù)(Multiple Instruction Single Data,MISD)方式,而實(shí)際上無(wú)線通信信號(hào)更合適用單指令多數(shù)據(jù)(Single Instruction Multiple Data,SIMD)方式處理。另外一種基于中央處理器(Central Processing Unit,CPU)的SDR 結(jié)構(gòu)則是通過(guò)CPU 來(lái)運(yùn)行信號(hào)處理系統(tǒng),雖然此類SDR結(jié)構(gòu)對(duì)通信系統(tǒng)的開(kāi)發(fā)與維護(hù)提供了更便利的實(shí)現(xiàn)方式,但無(wú)線通信運(yùn)行過(guò)程中常伴隨著大量的數(shù)據(jù)并行運(yùn)算,CPU 流式架構(gòu)的指令執(zhí)行方式難以滿足寬帶通信系統(tǒng)的實(shí)時(shí)性要求。
圖形處理器(Graphic Processing Unit,GPU)由數(shù)量眾多的計(jì)算單元和超長(zhǎng)的流水線組成,適合處理數(shù)據(jù)類型高度一致、相互無(wú)依賴的大規(guī)模數(shù)據(jù)。GPU 作為高并行度的運(yùn)算設(shè)備,相較于FPGA 更易于編程實(shí)現(xiàn)與修訂,且在邏輯資源的拓展中更具有優(yōu)勢(shì),成本也更低。與CPU 相比,GPU 代表的眾核架構(gòu)一般存在數(shù)千個(gè)運(yùn)算核心,這使得GPU 在應(yīng)對(duì)信號(hào)處理中超大的數(shù)據(jù)時(shí)比CPU 更具有超高速計(jì)算能力和超大數(shù)據(jù)處理帶寬,如NVIDIA TITAN RTX 系列GPU 峰值吞吐量為16.3 TFLOPS(參考網(wǎng)址https://developer.nvidia.com/cuda-gpus),該吞吐量是目前主流CPU 的數(shù)十倍到數(shù)百倍以上,其主流設(shè)計(jì)平臺(tái)是以C/C++語(yǔ)言為基礎(chǔ)的計(jì)算統(tǒng)一設(shè)備架構(gòu)(Compute Unified Device Architecture,CUDA)。
低密度奇偶校驗(yàn)(Low Density Parity Check,LDPC)碼具有誤碼率低、低時(shí)延和校驗(yàn)矩陣構(gòu)造簡(jiǎn)單的特點(diǎn),糾錯(cuò)能力接近香 農(nóng)極限。它 于1962 年 被Gallager[1]和Tanner[2]發(fā) 明,并隨之提出了相應(yīng)的迭代譯碼算法。1996 年LDPC 碼受到Tanner[2]和MacKay 等[3]重視,并在其基礎(chǔ)上提出了優(yōu)化后的置信傳播(Belief Propagation,BP)譯碼算法。之后,Chen 等[4]將BP 算法的復(fù)雜度進(jìn)一步降低,在犧牲一定譯碼性能的情況下提出了最小和(Min-Sum,MS)譯碼算法,該算法極大地簡(jiǎn)化了關(guān)于LDPC 譯碼中節(jié)點(diǎn)更新的計(jì)算復(fù)雜度,并且不需要對(duì)加性高斯白噪聲(Additive White Gaussian Noise,AWGN)信道進(jìn)行噪聲功率估計(jì)。近年來(lái),也有不少專家致力于LDPC 碼的研究,文獻(xiàn)[5]中基于BP 算法的LDPC 卷積碼的窗口解碼方案,提出了對(duì)于BP 解碼器和加窗解碼器,探討在無(wú)記憶擦除信道上獲得接近理論極限的性能。文獻(xiàn)[6]中則通過(guò)將多個(gè)不相交或未耦合的LDPC 碼Tanner 圖耦合到一個(gè)耦合鏈中,用一種新的方式利用低復(fù)雜度譯碼在無(wú)內(nèi)存的二進(jìn)制輸入對(duì)稱輸出通道上構(gòu)建實(shí)現(xiàn)代碼。文獻(xiàn)[7-8]中提出的空間耦合LDPC 碼構(gòu)建方式在相應(yīng)的應(yīng)用場(chǎng)景有著更優(yōu)秀的性能。與此同時(shí),非二進(jìn)制(Non-Binary)LDPC 碼也在飛速地更新發(fā)展,文獻(xiàn)[9]中在考慮了非二進(jìn)制的準(zhǔn)循環(huán)LDPC 碼特征的情況下,提出了早期分層解碼調(diào)度方案,實(shí)現(xiàn)了比以往更大更高的吞吐量和效率;文獻(xiàn)[10]中則將有限域上的非二進(jìn)制低密度奇偶校驗(yàn)(Non Binary-Low Density Parity Check,NB-LDPC)碼視為子域上的碼,在略微損失性能的情況下降低了解碼復(fù)雜度。
LDPC 譯碼器常用的主流框架為FPGA 架構(gòu),隨著GPU設(shè)計(jì)理念的不斷更新迭代,研究者也開(kāi)始探尋基于GPU 架構(gòu)設(shè)計(jì)譯碼器的可能性。文獻(xiàn)[11]中提出了一種在CUDA平臺(tái)的并行滑動(dòng)窗口置信傳播(Sliding Window Belief Propagation)算法來(lái)解碼LDPC 碼字,提出的基于CPU+GPU的異構(gòu)并行算法相比CPU 架構(gòu)獲得了14~118 倍的加速比。文獻(xiàn)[12]中分析了FPGA 架構(gòu)的缺點(diǎn),探討了GPU 架構(gòu)以更短的部署周期、靈活開(kāi)發(fā)且可擴(kuò)展成本更低的優(yōu)點(diǎn)作為替代方案的可能,并且在高碼率、采用提前中止策略的情況下獲得了較高的吞吐量。文獻(xiàn)[13]中實(shí)現(xiàn)了基于GPU 的加權(quán)比特可靠性(weighted Bit Reliability Based,wBRB)解碼器,并探討了在列度較大、速率較高情況下所提出譯碼器平衡誤碼性能和吞吐量性能的方法。文獻(xiàn)[14]中額外使用了GPU 的高速片上內(nèi)存,使得普通GPU 譯碼器的性能提升了5.32~10.41 倍,文獻(xiàn)[15]中的GPU 增強(qiáng)準(zhǔn)最大似然(Enhanced Quasi-Maximum Likelihood,EQML)譯碼器則在保持糾錯(cuò)性能的同時(shí)譯碼速度相較于CPU 提升了約2 個(gè)數(shù)量級(jí)。
LDPC 的BP 譯碼算法的主要思路是通過(guò)消息傳播將當(dāng)前節(jié)點(diǎn)的概率分布狀態(tài)傳遞給相鄰的節(jié)點(diǎn),并且更新相鄰某節(jié)點(diǎn)的概率分布狀態(tài),進(jìn)而讓節(jié)點(diǎn)的概率分布狀態(tài)在多次更新中得到收斂;但由于算法雙曲正切(tanh)函數(shù)的存在,使得譯碼過(guò)程中的計(jì)算極為復(fù)雜。歸一化最小和(Normalized Min Sum,NMS)算法是在BP 算法的基礎(chǔ)上對(duì)復(fù)雜的運(yùn)算操作進(jìn)行簡(jiǎn)化的一種算法,如式(2)所示,用和積運(yùn)算替換了tanh 操作,從而降低了計(jì)算的復(fù)雜度。NMS 算法的另一個(gè)優(yōu)勢(shì)在于初始化軟信息時(shí)不需要相關(guān)的信道信息,算法步驟如下所示:
1)初始化。
其中:L(rij)為校驗(yàn)節(jié)點(diǎn)i傳給變量節(jié)點(diǎn)j的信息,Lj為信號(hào)的初始信息,yj為實(shí)際接收碼字,L(qji)表示變量節(jié)點(diǎn)j傳給校驗(yàn)節(jié)點(diǎn)i的信息。
2)更新校驗(yàn)節(jié)點(diǎn)、變量節(jié)點(diǎn)信息。
式(2)中Rij表示與校驗(yàn)節(jié)點(diǎn)i相連的變量節(jié)點(diǎn)的集合Ri與第j變量節(jié)點(diǎn)的差集,式(3)中Cji表示與變量節(jié)點(diǎn)j相連的變量節(jié)點(diǎn)的集合Cj與第i校驗(yàn)節(jié)點(diǎn)的差集。
3)信息更新并判決。
式(4)中表示每次迭代更新后的軟信息。式(5)則根據(jù)線性分組碼的特性,判斷是否滿足HcT=0 或譯碼循環(huán)迭代次數(shù)是否達(dá)到最大:是則停止迭代并直接輸出譯碼碼字c;否則跳轉(zhuǎn)到步驟2 重新迭代,其中H為校驗(yàn)矩陣。
NMS 算法優(yōu)化了迭代中節(jié)點(diǎn)信息的更新方式,同時(shí)在譯碼迭代過(guò)程中加入了系數(shù)α(0 <α<1)來(lái)彌補(bǔ)譯碼過(guò)程中因簡(jiǎn)化計(jì)算方式而導(dǎo)致的性能損失。
LDPC 譯碼方法中消息的傳遞方式主要分為兩種形式:泛洪式(Flooding)譯碼方案和分層(Layered)譯碼方案。泛洪式譯碼作為傳統(tǒng)的譯碼方案,其譯碼過(guò)程如上述NMS 譯碼算法所示,在迭代過(guò)程中通過(guò)依照H的非零項(xiàng)順序逐行更新變量節(jié)點(diǎn),然后逐列更新變量節(jié)點(diǎn)來(lái)完成譯碼。分層式歸一化最小和(Layered Normalized Min Sum,LNMS)方案則與前者不同,主要是將H矩陣按某種特定的規(guī)則在行層面分層,按層結(jié)構(gòu)對(duì)每一層的節(jié)點(diǎn)信息進(jìn)行更新,然后將更新好的消息直接傳入下一層作為已知參數(shù)繼續(xù)更新消息。以NMS 算法為例,其分層譯碼過(guò)程如下所示:
1)初始化。
2)分層更新。
分層譯碼方案的優(yōu)勢(shì)在于能將本次迭代中已經(jīng)計(jì)算出的校驗(yàn)節(jié)點(diǎn)信息及時(shí)地更新到總的節(jié)點(diǎn)信息中,使其可以用于計(jì)算下一個(gè)校驗(yàn)節(jié)點(diǎn)的校驗(yàn)信息,這將極大地提高譯碼的收斂速度。通過(guò)Matlab 仿真證明,分層消息傳遞機(jī)制的平均譯碼迭代次數(shù)在相同的信道環(huán)境下是泛洪式消息傳遞機(jī)制的一半,且分層譯碼機(jī)制的優(yōu)勢(shì)在于較少的中間變量更加適合通過(guò)硬件實(shí)現(xiàn),節(jié)省硬件資源。
圖1 展示了基于NMS 算法IEEE 802.16 標(biāo)準(zhǔn)下各算法性能對(duì)比,其中,所有算法的迭代次數(shù)上限為10 次,并添加了迭代的提前終止條件??梢钥闯?,在泛洪式和分層譯碼結(jié)構(gòu)下,BP 算法性能最佳,NMS 算法次之,硬判決算法性能最差;對(duì)比兩種結(jié)構(gòu)的譯碼方案,分層譯碼方案能在更少的迭代次數(shù)下取得更好的譯碼性能。
圖1 LDPC譯碼算法性能對(duì)比Fig.1 Performance comparison of LDPC decoding algorithms
LDPC 碼的譯碼過(guò)程中涉及多次且復(fù)雜的運(yùn)算,這導(dǎo)致流式的LDPC 譯碼器在高速無(wú)線通信系統(tǒng)中無(wú)法滿足系統(tǒng)的實(shí)時(shí)性要求,造成較大時(shí)延。分析LDPC 的譯碼流程可看出,迭代過(guò)程中各校驗(yàn)節(jié)點(diǎn)與變量節(jié)點(diǎn)軟信息的更新之間并無(wú)依賴關(guān)系,因此等信息的迭代更新可以采用GPU 進(jìn)行加速,利用GPU 的多線程和高并行性將會(huì)極大地提高LDPC 譯碼器的譯碼效率和減小譯碼延遲。
本文采用的并行方式為以分層譯碼機(jī)制為基礎(chǔ)的針對(duì)準(zhǔn)循環(huán)低密度奇偶校驗(yàn)(Quasi Cyclic-Low Density Parity Check,QC-LDPC)碼的部分并行譯碼。LDPC 譯碼算法的流程如圖2 所示,分別使用基于CPU 的流串行式和基于CPU+GPU 的異構(gòu)并行式對(duì)譯碼算法中的部分流程進(jìn)行處理。
圖2 LNMS譯碼算法流程Fig.2 Flow chart of LNMS decoding algorithm
設(shè)DataNums為檢驗(yàn)矩陣H的基矩陣Hb中的非零項(xiàng)數(shù)量,Zc為H的擴(kuò)展因子,M為Hb的行數(shù),RowDegree為H的最大行重。從LDPC 碼的譯碼過(guò)程可知,傳統(tǒng)串行譯碼在每一次更新校驗(yàn)節(jié)點(diǎn)或變量節(jié)點(diǎn)時(shí)需遍歷DataNums個(gè)的數(shù)據(jù),在分層譯碼機(jī)制下,這些數(shù)據(jù)的更新只與上一層傳遞的消息有關(guān);因此,可將QC-LDPC 碼的校驗(yàn)矩陣以基矩陣Hb的形式,按Zc行劃分M個(gè)子矩陣,則每個(gè)子矩陣是維度為Zc×N、列重不大于1 的稀疏矩陣,并分配Zc×RowDegree個(gè)線程對(duì)每一層的子矩陣進(jìn)行譯碼。具體的和等信息更新的并行策略如圖3 所示,以行重、列重分別為3、1,Zc為6 的子矩陣為例,則總共需要分配18 個(gè)線程進(jìn)行計(jì)算。
圖3 并行策略Fig.3 Parallel strategy
根據(jù)圖3 的并行策略可以擴(kuò)展到實(shí)際的LDPC 碼并行分層NMS 譯碼算法設(shè)計(jì)?,F(xiàn)考慮一個(gè)序號(hào)為id的線程,有:
其中:blockId為當(dāng)前線程(thread)所處的線程塊索引,threadId則為所處線程塊中的線程索引,threadNum為單個(gè)線程塊擁有的線程數(shù)。將id代入式(7)~(10)中的j變量,變量i則對(duì)應(yīng)校驗(yàn)矩陣H第m層中第id列非0 位置的行數(shù)索引。
LNMS 的GPU 并行思路是在不同層迭代時(shí)調(diào)用不同數(shù)量的線程以完成分層NMS 算法的并行實(shí)現(xiàn),具體流程如算法1 所示。
算法1 基于GPU 的LNMS 算法。
算法1 中MaxIter為最大迭代次數(shù),chunkNum為校驗(yàn)矩陣的行子矩陣數(shù)量,RowNum為基矩陣對(duì)應(yīng)行的行度,由于本文使用的是非規(guī)則LDPC 碼,所以RowNum的大小是擴(kuò)展因子Zc與基矩陣各行行重的乘積,Syncthreads 和threadfence均為CUDA 內(nèi)置函數(shù)。對(duì)接收的信號(hào)進(jìn)行初始化后,依據(jù)校驗(yàn)矩陣H對(duì)其進(jìn)行分層譯碼,考慮到校驗(yàn)矩陣存在非規(guī)則的情況,即每一層的行度可能不一致,因此事先將每一子矩陣行度儲(chǔ)存在RowNum矩陣中,該算法的并行部分主要體現(xiàn)在更新第m行節(jié)點(diǎn)信息時(shí)都使用RowNum[m]個(gè)線程進(jìn)行處理。
LDPC 碼的譯碼步驟之間存在著依賴關(guān)系,即當(dāng)前步驟計(jì)算所需的數(shù)據(jù)依賴于上一步所得數(shù)據(jù),且在程序初始化的并行配置中需要用到多個(gè)線程塊;因此,在CUDA 核函數(shù)中間有必要適當(dāng)?shù)貙?duì)GPU 設(shè)備中的全局內(nèi)存進(jìn)行數(shù)據(jù)同步,即需要每個(gè)線程塊在完成上一步驟之后對(duì)所有的線程塊進(jìn)行全局同步,以統(tǒng)籌、更新數(shù)據(jù)。常見(jiàn)的處理方式為使用多個(gè)核函數(shù)進(jìn)行串行處理,但是會(huì)造成額外的時(shí)間損耗。因此本文采用的方式是在單個(gè)核函數(shù)上進(jìn)行數(shù)據(jù)同步。CUDA編程中雖然沒(méi)有針對(duì)網(wǎng)格之間同步的函數(shù),但是譯碼數(shù)據(jù)的全局同步可以采用如圖4 所示的方式實(shí)現(xiàn)。
Syncthreads 函數(shù)為程序中的顯式柵欄,要求塊內(nèi)的線程必須等待直到所有線程完成先前的操作。threadfence 函數(shù)將阻塞調(diào)用線程,直到當(dāng)前線程對(duì)全局內(nèi)存或共享內(nèi)存的寫(xiě)入對(duì)其他線程可見(jiàn)為止。atomicAdd 為CUDA 原子操作,保證了在同一個(gè)顯存變量依次進(jìn)行“讀-計(jì)算-寫(xiě)”操作時(shí)的連貫執(zhí)行,而不會(huì)被其他線程進(jìn)行中斷。
如圖4 所示,實(shí)線箭頭為該線程實(shí)際的運(yùn)行時(shí)間,虛線箭頭為該線程的等待時(shí)間,可以看出每個(gè)線程塊(Block)中的所有線程在完成任務(wù)后首線程進(jìn)入while 循環(huán),并等待其他線程塊是否到達(dá)障礙點(diǎn)。若所有的線程塊完成操作,則進(jìn)入下一階段運(yùn)算。這種全局內(nèi)存同步方式可實(shí)現(xiàn)憑單個(gè)核函數(shù)就能完成單個(gè)碼字的譯碼,并可以拓展到多個(gè)碼字的情況。
圖4 同步實(shí)現(xiàn)方式Fig.4 Synchronization implementation method
LNMS 算法在譯碼過(guò)程中需要頻繁地使用校驗(yàn)矩陣H,如果將校驗(yàn)矩陣信息直接儲(chǔ)存在GPU 內(nèi)存會(huì)導(dǎo)致顯存空間的大量占用,同時(shí)也不利于數(shù)據(jù)的位置索引與調(diào)度。本文在參考文獻(xiàn)[16]中構(gòu)造壓縮矩陣的基礎(chǔ)上,給出一種不規(guī)則LDPC 碼的校驗(yàn)矩陣壓縮存儲(chǔ)方案:將校驗(yàn)矩陣H分解為1個(gè)二維矩陣HRow和1 個(gè)一維矩陣RowNum,其中HRow存儲(chǔ)著H矩陣中每行的非0 項(xiàng)元素的列索引,RowNum存放著H矩陣每行的非0 項(xiàng)元素的數(shù)量,這兩個(gè)矩陣中包含了譯碼過(guò)程中所需的所有校驗(yàn)矩陣信息??梢钥闯?,由于校驗(yàn)矩陣的稀疏性,一個(gè)M行N列、行重和列重分別為m和n的矩陣H,m和n遠(yuǎn)遠(yuǎn)小于M和N,經(jīng)壓縮后只需要M(m+1)個(gè)數(shù)據(jù)即可完整表示H矩陣的所有所需信息,矩陣的壓縮效率與m有關(guān)。此外,譯碼迭代中的等概率信息也將以這種方式構(gòu)建,矩陣內(nèi)元素的位置索引可直接從壓縮后的矩陣獲得,而無(wú)需額外的內(nèi)存空間儲(chǔ)存信息;同樣地,在對(duì)節(jié)點(diǎn)信息進(jìn)行更新時(shí)也能調(diào)用更少的線程,進(jìn)而節(jié)省GPU 設(shè)備資源。與此相同,規(guī)則LDPC 碼這種壓縮方式也適用于本文所使用的非規(guī)則LDPC 碼。
CUDA 程序運(yùn)行前后需要先在CPU 和GPU 之間通過(guò)PCI-E 總線進(jìn)行數(shù)據(jù)通信,數(shù)據(jù)的傳輸速度取決于總線的帶寬,這一部分?jǐn)?shù)據(jù)通信的時(shí)間是除了kernel 執(zhí)行函數(shù)之外額外的時(shí)間損耗。因此,為了優(yōu)化CPU 與GPU 之間的數(shù)據(jù)調(diào)度機(jī)制,引入了CUDA 的流并行機(jī)制對(duì)多個(gè)輸入碼字進(jìn)行并行處理。
常量?jī)?nèi)存(Constant memory)在每個(gè)SM 中有專用的片上緩存,大小一般限制為64 KB,在常量緩存中讀取內(nèi)存比直接在全局內(nèi)存中讀取的延遲要小得多;因此可將類似校驗(yàn)矩陣H經(jīng)壓縮后的HRow和RowNum等不需要改寫(xiě)的數(shù)據(jù)放入常量?jī)?nèi)存中,以減少譯碼延遲。
本文實(shí)驗(yàn)所用的CPU 為Intel Xeon Gold 5122 CPU @3.60 GHz,GPU 為Quardro RTX 5000,該顯卡 全局內(nèi)存為16 GB,計(jì)算機(jī)內(nèi)存為64 GB,操作系統(tǒng)為Ubuntu 18.04.5 LTS,64 bit,編程環(huán)境為CUDA 11.0,GCC 版本為gcc 7.5.0,Cmake 版本為cmake 3.19.2 Linux。本文實(shí)驗(yàn)的GPU 端代碼使用CUDA C 編寫(xiě),CPU 端代碼使用C/C++編寫(xiě),編譯、調(diào)試方式采用CMake 工具。
并行算法的加速性能一般使用加速比表示,加速比的大小取決于算法中串行與并行部分的占比和GPU 的處理器數(shù)量,如式(10)所示,可通過(guò)計(jì)算譯碼時(shí)延獲得加速比:
其中:CPU_version_run_time為L(zhǎng)DPC 譯碼程序在CPU 上運(yùn)行的實(shí)際時(shí)間;GPU_version_run_time則是程序在GPU+CPU 異構(gòu)平臺(tái)上運(yùn)行的實(shí)際時(shí)間。圖5 為各種并行碼字?jǐn)?shù)量下加速比的性能曲線,縱軸已進(jìn)行對(duì)數(shù)處理。對(duì)于譯碼器的性能常用吞吐量衡量,如式(11)所示:
圖5 多碼字并行度下的加速比性能Fig.5 Speedup performance under multi-codeword parallelism
其中:Throughput為吞吐量(b/s),N為碼字的位數(shù)(bit),Cn為并行的碼字?jǐn)?shù)量,Tp為迭代次數(shù),T為單次迭代時(shí)延(s)。在實(shí)際測(cè)試中,根據(jù)碼字并行的數(shù)量不同,吞吐量性能如圖6所示,其中使用的碼字結(jié)構(gòu)為(2 034,1 152)的QC-LDPC,調(diào)制方式為BPSK 調(diào)制,信道為高斯白噪聲信道。譯碼器未設(shè)置迭代提前結(jié)束條件,因此,所使用的算法一直持續(xù)到最大迭代次數(shù);同時(shí),為了查看所提出譯碼的實(shí)際性能,本文經(jīng)過(guò)多次測(cè)量得出了保證最佳誤碼率結(jié)果所需的迭代次數(shù),固定為10 次,所測(cè)并行碼字?jǐn)?shù)量為1~10 000。由于GPU 設(shè)備的設(shè)置時(shí)間與譯碼器實(shí)際性能無(wú)關(guān)且會(huì)影響吞吐量的計(jì)算,因此測(cè)試中忽略了GPU 設(shè)備的初始化時(shí)間。本文所進(jìn)行的測(cè)試均在移植了譯碼CUDA 程序的GNU Raido 平臺(tái)上進(jìn)行。
圖6 多碼字并行度下的吞吐量性能對(duì)比Fig.6 Comparison of throughput performance under multi-codeword parallelism
由圖5 可知,隨著并行碼字的增加,加速比逐漸增加,并在約4 000 個(gè)碼字并行時(shí)達(dá)到峰值,隨后譯碼器的加速比穩(wěn)定維持在200 倍左右。經(jīng)驗(yàn)證,該譯碼器的誤碼率性能與圖1 中Matlab 仿真的結(jié)果基本相同,無(wú)額外的譯碼性能損失。值得注意的是,在碼字并行度較小的情況下(<5),GPU對(duì)于譯碼程序性能收益較小,這是由于在程序調(diào)用核函數(shù)時(shí)GPU 設(shè)備和上下文初始化的開(kāi)銷較大,為10 ms 左右,然而這部分性能開(kāi)銷一般是固定的,不會(huì)隨著數(shù)據(jù)量的增加而變化。因此,在小并行度時(shí),該部分時(shí)延占據(jù)了大部分的性能開(kāi)銷,從而導(dǎo)致性能收益不大甚至負(fù)收益。但是隨著數(shù)據(jù)量的上升,該部分耗時(shí)占比逐漸下降到可以忽略的程度,而程序運(yùn)行時(shí)間占比逐漸上升并占據(jù)主要開(kāi)銷,使得GPU 加速的性能優(yōu)勢(shì)得以顯現(xiàn)并最終保持穩(wěn)定。
由圖6 可看出,隨著碼字并行數(shù)量的增加,譯碼器的吞吐量隨之上升,在碼字?jǐn)?shù)量為3 000 左右時(shí)變化逐漸穩(wěn)定,與圖5 相比提前1 000 碼字就趨于平穩(wěn),原因是計(jì)算加速比時(shí)還考慮了GPU 設(shè)備和CUDA 流的初始化時(shí)間。最終譯碼器的延遲僅維持在2.1 μs 左右,吞吐量的維持在1 Gb/s 左右,上下浮動(dòng)誤差不超過(guò)10 Mb/s。通過(guò)分析可知,吞吐量趨于穩(wěn)定的原因可以歸納為當(dāng)前GPU 硬件資源的占用率已經(jīng)達(dá)到上限,即并行譯碼碼字?jǐn)?shù)量和GPU 的處理效率達(dá)到峰值,使得吞吐量不再變化;若想進(jìn)一步提高性能,可考慮將單個(gè)GPU 換為多個(gè)GPU 集群。
本文同時(shí)參考了其他文獻(xiàn)所設(shè)計(jì)的LDPC 譯碼器,并與它能到達(dá)的吞吐量性能進(jìn)行對(duì)比,如表1 所示。理論上,對(duì)于相同設(shè)計(jì)框架的并行譯碼器來(lái)說(shuō),碼率越大,吞吐量會(huì)隨之增加,但譯碼性能也會(huì)隨之降低??梢宰⒁獾?,與其他基于GPU 的LDPC 解碼器相比,本文提出的譯碼架構(gòu)在同等條件下實(shí)現(xiàn)了更低的譯碼延遲。
表1 不同譯碼器的對(duì)比Tab.1 Comparison of different decoders
本文通過(guò)提出一種能運(yùn)行在GNU Radio 平臺(tái)上的基于GPU 的并行LNMS 譯碼方法對(duì)非規(guī)則LDPC 碼進(jìn)行加速譯碼,并在GPU 設(shè)備底層原理基礎(chǔ)上提出了一些優(yōu)化策略以提高加速性能。本文算法由NVIDIA RTX 5000 GPU 加速,與串行順序的LNMS 算法流程不同,并行LNMS 算法流程中通過(guò)同時(shí)調(diào)用數(shù)千個(gè)CUDA 線程來(lái)完成各節(jié)點(diǎn)的信息交換與更新,并通過(guò)妥善處理GPU 的內(nèi)存體系結(jié)構(gòu)減少了線程對(duì)于全局內(nèi)存的讀寫(xiě)次數(shù)與讀寫(xiě)時(shí)間。為了研究加速效應(yīng),本文在GNU Radio 平臺(tái)上分別構(gòu)建了串行順序LNMS 算法譯碼器和并行順序LNMS 算法譯碼器。實(shí)驗(yàn)結(jié)果表明,非規(guī)則LDPC 碼的并行LNMS 譯碼器能達(dá)到約200 倍的加速比,在多碼字并行的情況下吞吐量穩(wěn)定在1 Gb/s 以上。后續(xù),可針對(duì)當(dāng)前算法中CPU 與GPU 通信時(shí)間仍然較大的缺點(diǎn)進(jìn)行優(yōu)化,進(jìn)一步減少通信時(shí)間在總流程中的占比,以提高實(shí)際的吞吐量性能。