主要内容

DVB-S.2基于gpu的LDPC译码器系统仿真

这个例子展示了如何使用一个基于gpu的LDPC解码器系统对象™来提高通信系统仿真的速度。通过ETSI(欧洲电信标准协会)EN 302 307广播、交互服务、新闻采集和其他宽带卫星应用(DVB-S.2)标准的建模部分说明了性能的改善。[1]。有关使用系统对象来模拟DVB-S.2系统的更多信息,请参阅DVB-S.2在Simulink中包括LDPC编码万博1manbetx.您必须拥有并行计算工具箱™用户许可才能使用基于gpu的LDPC解码器。

介绍

LDPC译码算法是计算昂贵的,构成了绝大多数时间花费在DVB-S。2仿真。使用comm.gpu.LDPCDecoder System对象在GPU上执行解码算法,极大地提高了仿真运行时间。这个例子模拟了DVB-S。2 .系统,获取一个基准速度(运行时间),一次具有一个基于cpu的LDPC解码器功能(ldpcDecode)并用基于GPU的LDPC解码器(comm.gpu.LDPCDecoder)。该示例捕获两个版本的误比特率,以显示使用GPU时解码性能没有损失。

流(...“DVB-S.2数字视频广播标准误码率模拟\n\n”);
DVB-S.2数字视频广播标准误码率仿真
流(...CPU加速解码器和GPU加速解码器的性能比较);
CPU加速解码器与GPU加速解码器的性能比较。

GPU存在检测

示例试图查询GPU以检测并行计算工具箱用户许可证以及存在支持的GPU的存在。万博1manbetx如果GPU或并行计算工具箱不可用,则可以执行仅CPU的模拟。

尝试%查询GPUdev = parallel.gpu.gpudevice.current;%打印有关找到的GPU的信息流(...'检测到GPU (%s, %d多处理器,计算能力%s)\n'...开发人员名称、开发人员多处理器计数、开发人员计算能力);%包括基于GPU的模拟。dogpu = true;抓住%#好的% GPU不支持或不存在,或并行计万博1manbetx算%工具箱不存在且未获得许可。考虑只CPU的模拟。inp=输入([“***注意:未检测到GPU。”...“继续只用cpu进行模拟?”[Y] / N '],“年代”);如果strcmpi (inp,'是') || is空(inp) doGPU = false;别的返回结尾结尾
检测到GPU(Tesla V100-PCIe-32GB,80多处理器,计算能力7.0)

初始化

getparamsdvbs2demo.m.函数生成一个结构dvb,它保存dvb - s的配置信息。2 .系统给定以下参数。随后,示例包括基于dvb结构创建和配置System对象。

createSimObjDVBS2Demo.m脚本构造DVB-S中使用的大多数System对象。2,并根据DVB结构进行配置。

然后,创建LDPC解码器配置对象和基于GPU的LDPC解码器系统对象。LDPC解码器配置对象将传递给基于CPU的CPUldpcDecode函数,该函数使用与基于gpu的LDPC解码器系统对象所使用的选项等效的选项。

% DVB-S.2系统参数subsystemtype =“QPSK 1/2”%星座和LDPC码率esnodb = 0.75;%每符号能量与噪声PSD之比(dB)numframes = 10;百分比要模拟的帧数maxnumldpciterations = 50;% LDPC解码器迭代DVB = GetParamsdvbs2demo(子系统rtype,esnodb,maxnumldpciterations);%创建并配置BCH编码器和解码器、调制器、解调器、,%AWGN频道。createSimObjDVBS2Demo;%构造LDPC编码器配置对象encoderCfg = ldpcEncoderConfig (dvb.LDPCParityCheckMatrix);%LDPC解码器配置ldpcPropertyValuePairs = {...“MaximumIterationCount”,dvb.ldpcnumiterations,...“ParityCheckMatrix”,dvb.ldpcparityCheckmatrix,...“决策方法”“艰难的决定”...“IterationTerminationCondition”'最大迭代计数'...'opportValue'“信息部分”};%构造LDPC解码器配置对象decodercfg = ldpcdecoderconfig(dvb.ldpcparitycheckmatrix);如果DOGPU.%构造基于GPU的LDPC解码器系统对象gpuLDPCDecoder=comm.gpu.LDPCDecoder(ldpcPropertyValuePairs{:});结尾%创建错误对象以分析误码率的差异CPU与GPU之间的百分比。数量= comm.ErrorRate;

CPU和GPU性能比较

本示例首先使用基于CPU的LDPC解码器功能模拟DVB-S.2系统,然后使用基于GPU的LDPC解码器系统对象。本示例通过向系统传递多帧数据并测量系统总模拟时间来获得每个LDPC解码器的系统基准。第一帧数据会导致大量模拟离子初始化时间,因此,它被排除在基准计算之外。每帧和平均系统模拟时间被打印到命令窗口。系统的误码率(BER)也被打印到命令窗口,以说明基于CPU和基于GPU的LDPC解码器实现相同的BER。

如果Dogpu架构= 2;别的体系结构= 1;结尾%初始化运行时间结果向量运行时=零(架构,Numframes);AvgTime = Zeros(1,架构);%种子用于通道和消息的随机数生成器%这将允许CPU和GPU之间进行公平的误码率比较。%缓存原始随机流以稍后还原。原始\u rs=RandStream.getGlobalStream;rs=RandStream.create('MRG32K3A''种子',25);randstream.setGlobalstream(RS);%循环每个处理单元- CPU和GPU为了II = 1:架构%对执行循环进行一些初始设置如果(ii == 1)拱=“CPU”%使用CPU LDPC解码器别的拱门='GPU';解码器= gpuLDPCDecoder;%使用GPU LDPC解码器结尾%重置错误率对象重置(BER);重置随机流重置(rs);%通知用户DVB-S。模拟开始。fprintf([“\新加坡国立大学”'基于LDPC解码器:\ n']);dels = repmat(“\b”,1,fprintf('初始化......'));%主模拟循环。运行numFrames+1次,忽略第一次运行时%帧(具有初始化开销)% 计算。使用第一次运行进行BER计算。为了rr=1:(numFrames+1)%开始计时ts =抽搐;% ***创建输入消息*** %味精= 0 (encbch。MessageLength, 1);味精(1:dvb.NumInfoBitsPerCodeword) =...逻辑(randi([0 1],DVB.NuminfobitSperCodeword,1));%***传输***%bchencOut=encbch(msg);ldpcentcout=ldpcEncode(bchencOut,encoderCfg);xlvrOut=intrlv(ldpcentcout,dvb.InterleaveOrder);modOut=pskModulator(xlvrOut);*** *噪音*** %chanout = chan(modout);%***收到***%ydemodOut = pskDemodulator (chanOut);dexlvrOut = deintrlv (demodOut dvb.InterleaveOrder);%使用合适的LDPC解码器。如果比较字符串(拱,“CPU”)ldpcdecOut=逻辑(ldpcDecode)(dexlvrOut、decoderCfg、dvb.LDPCNUMIATIONS、,'决定'“硬”“终止”“马克斯”'输出格式'“信息”));别的ldpcdecOut=解码器(dexlvrOut);结尾bchdecout = decbch(ldpcdecout);%*** Compute Ber ***%计算LDPC输出的BER,而不是BCH。ber=ber(逻辑(bchencOut),ldpcdecOut);%停止计时器Runtime (ii, rr) = toc(ts);%不报告带有初始化开销的第一帧。如果(rr> 1)fprintf(dels);newcharstodelete = fprintf('帧%d解码:%.2f sec'...RR-1,运行时(II,RR));dels = repmat(“\b”,1,newCharsToDelete);结尾结尾%通过DVB-S.2系统运行帧的结束。将运行时结果报告到命令窗口。流(del);%删除打印出来的最后一行。%计算平均运行时间。不包括坐标系1,因为它%包括一些系统对象初始化时间。avgtime (ii) =意味着(运行时(ii, 2:结束));流('%d帧解码,%.2f sec /框架\ n',numframes,avgtime(ii));流('塔错误率:%g \ n',BER(1));结尾%体系结构循环
使用基于CPU的LDPC解码器:
初始化......
框架1解码:0.29秒框架2解码:0.30秒框架3解码:0.32秒框架4解码:0.29秒框架5解码:0.25秒框架6解码:0.29秒框架7解码:0.26秒框架8解码:0.29秒框架9解码:0.28秒框架10解码:0.26秒
10帧解码,0.28秒/框架
误码率:0.00785634
使用基于GPU的LDPC解码器:
初始化......
框架1解码:0.12秒框架2解码:0.12秒框架3解码:0.12秒框架4解码:0.11秒框架5解码:0.09秒框架6解码:0.12秒框架7解码:0.09秒框架8解码:0.12秒框架9解码:0.12秒框架10解码:0.09秒
10帧解码,0.11秒/帧
误码率:0.00785634
将随机流重置为缓存对象RandStream.setGlobalStream (original_rs);

使用类似于上面所示的代码,对比特误差率进行了离线测量。如图所示,基于GPU和cpu的LDPC解码器的误码率性能是相同的。

总结

如果使用GPU,则使用GPU LDPC解码器VS A CPU LDPC解码器基于DVB-S.2系统的平均运行时间来显示加速。

如果〜dogpu fprintf('\ n *** gpu不呈现*** \ n \ n');别的%计算系统加速比fprintf(['\ nfull系统仿真使用的速度速度为0.2f次...基于gpu的LDPC解码器。\n\n'), avgtime (1) / avgtime (2));结尾
使用基于gpu的LDPC解码器的全系统仿真运行速度快2.60倍。

附录

本示例使用createSimObjDVBS2Demo.m脚本和getparamsdvbs2demo.m.helper函数。

选定的书目

  1. 标准EN 302 307 V1.1.1:数字视频广播(DVB);第二代帧结构,用于广播、交互服务、新采集和其他宽带卫星应用的信道编码和调制系统(DVB-S.2),欧洲电信标准协会,瓦邦,法国,2005-03