主要内容

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

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

简介

LDPC解码算法的计算成本很高,在DVB-S中占据了绝大部分时间。2仿真。使用com . 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加速解码器的性能比较\n);
CPU和GPU加速解码器的性能比较。

GPU存在检测

该示例尝试查询GPU以检测并行计算工具箱用户许可证和受支持GPU的存在。金宝app如果GPU或并行计算工具箱不可用,则只能执行cpu模拟。

试一试%查询GPUdev = parallel.gpu.GPUDevice.current;打印找到的GPU的信息。%流(...'已检测到GPU (%s, %d多处理器,计算能力%s)\n'...dev.Name、dev.MultiprocessorCount dev.ComputeCapability);包含一个基于gpu的模拟。doGPU = true;% #好< CTCH >% GPU不支持或不存在,或并行计金宝app算%工具箱不存在并已获得许可。考虑一个仅cpu的模拟。Inp =输入(['***注意:未检测到GPU。'...“继续只使用cpu的模拟?”[Y] / N '],“年代”);如果strcmpi (inp,“y”) ||为空(inp) doGPU = false;其他的返回结束结束
检测到GPU(特斯拉v100r001 - pcie - 32gb, 80个多处理器,计算能力7.0)

初始化

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

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

然后创建一个LDPC解码器配置对象和一个基于gpu的LDPC解码器系统对象。LDPC解码器配置对象被传递给基于cpu的处理器ldpcDecode函数,该函数使用的选项与基于gpu的LDPC解码器系统对象使用的选项相同。

% DVB-S.2系统参数subsystemType =“QPSK 1/2”星座码率和LDPC码率EsNodB = 0.75;每个符号能量与噪声PSD比的%,单位为dBnumFrames = 10;要模拟的帧数maxNumLDPCIterations = 50;% LDPC解码器迭代dvb = getParamsDVBS2Demo(subsystemType,EsNodB,maxNumLDPCIterations);创建和配置BCH编码器和解码器,调制器,解调器,AWGN频道。createSimObjDVBS2Demo;构造LDPC编码器配置对象encoderCfg = ldpcEncoderConfig(dvb.LDPCParityCheckMatrix);% LDPC解码器配置ldpcPropertyValuePairs = {...“MaximumIterationCount”, dvb。LDPCNumIterations,...“ParityCheckMatrix”, dvb。LDPCParityCheckMatrix,...“DecisionMethod”“艰难的决定”...“IterationTerminationCondition”“最大迭代次数”...“OutputValue”“信息部分”};构造LDPC解码器配置对象decoderCfg = ldpcDecoderConfig(dvb.LDPCParityCheckMatrix);如果doGPU构造一个基于gpu的LDPC解码器系统对象gpuLDPCDecoder = com .gpu. ldpcdecoder (ldpcPropertyValuePairs{:});结束创建一个ErrorRate对象,用于分析误码率的差异CPU和GPU之间的%。BER = com . errorrate;

CPU和GPU性能比较

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

如果doGPU架构= 2;其他的Architectures = 1;结束初始化运行时结果向量运行时= 0(架构,numFrames);Avgtime = 0(1,架构);为通道和消息使用的随机数生成器提供种子%的创造。这将允许CPU和GPU之间进行公平的误码率比较。缓存原始的随机流,以便稍后恢复。original_rs = RandStream.getGlobalStream;rs = RandStream.create(“mrg32k3a”“种子”25);RandStream.setGlobalStream (rs);%循环每个处理单元- CPU和GPUIi = 1:架构为执行循环做一些初始设置如果(ii == 1) arch =“CPU”%使用CPU LDPC解码器其他的拱=“图形”;解码器= gpuLDPCDecoder;%使用GPU LDPC解码器结束重置“错误率”对象重置(BER);重置随机流重置(rs);%通知用户DVB-S。2模拟开始。流([“\新加坡国立大学”基于LDPC的解码器:\n']);Dels = repmat(“\ b”流(“初始化…”));主要模拟循环。运行numFrames+1次,忽略第一次% frame(有初始化开销)%计算。使用第一次运行进行BER计算。rr = 1:(numFrames+1)%开始计时器Ts = tic;% ***创建输入消息*** %MSG = 0 (encbch。MessageLength, 1);味精(1:dvb.NumInfoBitsPerCodeword) =...逻辑(randi ([0 1] dvb.NumInfoBitsPerCodeword 1));% ***发送*** %bchencOut = encbch(msg);ldpcencOut = ldpcEncode(bchencOut,encoderCfg);xlvrOut = intrlv(ldpcencOut,dvb.InterleaveOrder);modOut = pskModulator(xlvrOut);% ***腐败噪音*** %chanOut = chan(modOut);% ***接收*** %ydemodOut = pskDemodulator(chanOut);dexlvrOut = deintrlv(demodOut,dvb.InterleaveOrder);使用合适的LDPC解码器。如果比较字符串(拱,“CPU”) ldpcdecOut = logical(ldpcDecode(dexlvrOut,decoderCfg,dvb. cfg)LDPCNumIterations,“DecisionType”“硬”“终止”“马克斯”“OutputFormat”“信息”));其他的ldpcdecOut =解码器(dexlvrOut);结束bchdecOut = decbch(ldpcdecOut);% ***计算误码率*** %计算LDPC输出的误码率,而不是BCH。ber = ber (logical(bchencOut),ldpcdecOut);%停止计时器Runtime (ii, rr) = toc(ts);不要报告带有初始化开销的第一帧。如果(rr > 1) fprintf(dels);newCharsToDelete = fprintf('帧%d解码:%。2 f交会”...rr-1,运行时(ii, rr));Dels = repmat(“\ b”1、newCharsToDelete);结束结束通过DVB-S运行帧的%结束。2系统。%向命令窗口报告运行时结果。流(del);删除打印出的最后一行。计算平均运行时间。不包括坐标系1,因为它%包括一些系统对象初始化时间。Avgtime (ii) = mean(runtime(ii,2:end));流(' %d帧解码,%。2 f秒/框架\ n '、numFrames avgtime (ii));流(误码率:%g \nber (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,则根据DVB-S的平均运行时间显示加速。2系统使用GPU LDPC解码器vs CPU LDPC解码器。

如果~ doGPU流('\n*** GPU不存在***\n\n');其他的计算系统范围的加速流([\n完整的系统模拟运行%。使用'快2f倍...'基于gpu的LDPC解码器。\n\n'],avgtime(1) / avgtime(2));结束
使用基于gpu的LDPC解码器,全系统仿真运行速度快2.60倍。

附录

本例使用createSimObjDVBS2Demo.m脚本和getParamsDVBS2Demo.mhelper函数。

选定的参考书目

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