主要内容

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

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

介绍

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

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

GPU存在检测

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

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

初始化

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

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

然后,基于CPU和gpu的LDPC Decoder System对象被创建并配置为相同的。

% 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编码器encldpc = comm.LDPCEncoder (dvb.LDPCParityCheckMatrix);%构造LDPC解码器系统对象LDPC解码器配置ldpcPropertyValuePairs = {...“MaximumIterationCount”, dvb。LDPCNumIterations,...“ParityCheckMatrix”, dvb。LDPCParityCheckMatrix,...“DecisionMethod”,“艰难的决定”,...“IterationTerminationCondition”,“最大迭代数”,...“OutputValue”,“信息部分”};构建LDPC解码器系统对象(CPU和GPU版本)decldpc = comm.LDPCDecoder (ldpcPropertyValuePairs {:});如果doGPU gpuLDPCDecoder = comm.gpu.LDPCDecoder(ldpcPropertyValuePairs{:});结束%创建ErrorRate对象,分析误码率的差异CPU与GPU之间的百分比。数量= comm.ErrorRate;

CPU和GPU性能比较

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

如果doGPU架构= 2;其他的架构= 1;结束初始化运行时结果向量运行时= 0(架构、numFrames);avgtime = 0(1、架构);% Seed用于通道和消息的随机数生成器%的创造。这将允许CPU和GPU之间公平的误码率比较。%缓存原始随机流以便稍后恢复。original_rs = RandStream.getGlobalStream;rs = RandStream.create (“mrg32k3a”,“种子”25);RandStream.setGlobalStream (rs);%循环每个处理单元- CPU和GPU2 = 1:架构为执行循环做一些初始设置如果(ii == 1“CPU”;解码器= decldpc;%使用CPU LDPC解码器其他的拱=“图形”;解码器= gpuLDPCDecoder;%使用GPU LDPC解码器结束%重置错误率对象重置(BER);重置随机流重置(rs);%通知用户DVB-S。模拟开始。流([“\新加坡国立大学”“基于LDPC译码器:\ n”]);德尔= repmat (“\ b”流(“初始化……”));%主模拟循环。运行numFrames+1次并忽略第一个%帧(具有初始化开销)%计算。使用第一次运行进行误码率计算。rr = 1:(numFrames + 1)%开始计时ts =抽搐;% ***创建输入消息*** %味精= 0 (encbch。MessageLength, 1);味精(1:dvb.NumInfoBitsPerCodeword) =...逻辑(randi ([0 1] dvb.NumInfoBitsPerCodeword 1));% * * *发送* * * %bchencOut = encbch(味精);ldpcencOut = encldpc (bchencOut);xlvrOut = intrlv (ldpcencOut dvb.InterleaveOrder);modOut = pskModulator (xlvrOut);*** *噪音*** %陈chanOut = (modOut);% * * *获得* * * %demodOut = pskDemodulator (chanOut);dexlvrOut = deintrlv (demodOut dvb.InterleaveOrder);%使用上面设置的LDPC解码器。ldpcdecOut =解码器(dexlvrOut);bchdecOut = decbch (ldpcdecOut);% ***计算误码率*** %计算LDPC输出的误码率,而不是BCH。数量=误码率(逻辑(bchencOut), ldpcdecOut);%停止计时器Runtime (ii, rr) = toc(ts);%不报告带有初始化开销的第一帧。如果(rr > 1) fprintf(dels);newCharsToDelete =流('帧%d解码:%。2 f交会”,...rr-1,运行时(ii, rr));德尔= repmat (“\ b”1、newCharsToDelete);结束结束%结束通过DVB-S运行一帧。2系统。将运行时结果报告到命令窗口。流(del);删除打印出来的最后一行。%计算平均运行时间。不包括坐标系1,因为它%包含一些系统对象初始化时间。avgtime (ii) =意味着(运行时(ii, 2:结束));流(' %d帧解码,%。2 f秒/框架\ n '、numFrames avgtime (ii));流('误码率:%g \n'ber (1));结束%建筑环
基于cpu的LDPC译码器:
初始化…
第一帧解码:0.17秒第二帧解码:0.17秒第三帧解码:0.17秒4帧解码:0.19秒5帧解码:0.15秒6帧解码:0.17秒7帧解码:0.15秒8帧解码:0.17秒9帧解码:0.18秒10帧解码:0.15秒
10帧解码,0.17秒/帧
误码率:0.00785634
基于gpu的LDPC解码器:
初始化…
第一帧解码:0.14秒第二帧解码:0.13秒第三帧解码:0.13秒4帧解码:0.14秒5帧解码:0.11秒6帧解码:0.13秒7帧解码:0.12秒8帧解码:0.14秒9帧解码:0.13秒10帧解码:0.12秒
10帧解码,0.13秒/帧
误码率:0.00785634
将随机流重置为缓存对象RandStream.setGlobalStream (original_rs);

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

总结

如果使用GPU,显示基于DVB-S的平均运行时间的加速。系统使用GPU LDPC译码器vs CPU LDPC译码器。

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

附录

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

选定的参考书目

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