基于gpu的系统对象在外观和行为上与Communications Toolbox™产品中的其他系统对象非常相似。重要的区别在于算法是在GPU (Graphics Processing Unit)上执行的,而不是在CPU上。使用GPU可以加速你的模拟。
“通信工具箱”产品的系统对象位于通讯
包和构造为:
H = comm.<对象名> .
例如,Viterbi Decoder System对象™构造为:
H = comm.ViterbiDecoder
如果存在对应的基于gpu的System对象实现,则它们位于comm.gpu
包装和构造如下:
H = comm.gpu。<对象名称>
例如,一个基于gpu的Viterbi Decoder System对象构造为:
H = comm.gpu.ViterbiDecoder
要查看基于gpu的可用实现的列表,请输入帮助通讯
在MATLAB®命令行,然后点击GPU实现.
图形处理器(Graphics Processing unit, gpu)擅长处理海量数据和高计算强度的计算。处理大量的数据是在模拟中最大化GPU吞吐量的一种方法。GPU在任何时候处理的数据量取决于传递给GPU System对象的输入数据的大小。因此,最大化数据大小的一种方法是处理多帧数据。
您可以使用单个GPU System对象来同时或并行处理多个数据帧。这与许多标准或非gpu系统对象的实现方式不同。对于GPU系统对象,对象在对对象函数的单个调用中处理的帧数要么由对象的一个属性隐含,要么使用NumFrames
属性。
这个例子展示了如何在bpsk调制的AWGN信道上传输涡轮编码的数据块。然后,它展示了如何使用迭代turbo译码器解码和显示错误。
定义噪声变量,建立帧长为256,并使用随机流属性,以便结果是可重复的。
noiseVar = 4;frmLen = 256;s = RandStream (“mt19937ar”,“种子”11);intrlvrIndices = randperm(s, frmLen);
创建Turbo Encoder System对象。构成卷积码的网格结构为poly2trellis(4,[13 15 17], 13)。的InterleaverIndices
属性指定对象用于将编码器上的输入位置换为整数列向量的映射。
turboEnc = comm.TurboEncoder (“TrellisStructure”poly2trellis (4...[13 15 17], 13),“InterleaverIndices”, intrlvrIndices);
创建BPSK Modulator System对象。
bpsk = comm.BPSKModulator;
创建一个AWGN Channel System对象。
频道= comm.AWGNChannel (“NoiseMethod”,“方差”,“方差”,...noiseVar);
创建一个基于gpu的Turbo Decoder System对象。构成卷积码的网格结构为poly2trellis(4,[13 15 17], 13)。的InterleaverIndicies
属性指定对象用于将编码器上的输入位置换为整数列向量的映射。
turboDec = comm.gpu.TurboDecoder (“TrellisStructure”poly2trellis (4...[13 15 17], 13),“InterleaverIndices”intrlvrIndices,...“NumIterations”4);
创建一个错误率系统对象。
errorRate = comm.ErrorRate;
运行仿真。
为frmIdx = 1:8 data = randi(s, [0 1], frmLen, 1); / /数据encodedData = turboEnc(数据);modSignal = bpsk (encodedData);receivedSignal =通道(modSignal);
将接收到的信号转换为对数似然比进行解码。
receivedBits = turboDec (2 / (noiseVar / 2)) *实际(receivedSignal));
将原始数据与接收数据进行比较,然后计算错误率结果。
errorStats = errorRate(数据、receivedBits);结束流('错误率= %f\n错误数= %d\ n总位数= %d\n',...errorStats errorStats (1) (2), errorStats (3))
这个例子展示了如何使用LDPC解码器系统对象同时处理两个数据帧。的ParityCheckMatrix
属性决定帧大小。对象处理的帧数由帧大小和输入数据向量长度决定。
numframes = 2;ldpcEnc = comm.LDPCEncoder;ldpcGPUDec = comm.gpu.LDPCDecoder;ldpcDec = comm.LDPCDecoder;MSG = randi([0 1], 32400,2);for ii=1:numframes, encout(:,ii) = ldpcEnc(msg(:,ii));end %单端到双极(适用于llr) encout = 1-2*encout;%Decode on the CPU for ii=1:numframes;cout (:, ii) = ldpcDec (encout(:,(二));end % GPU上的多帧解码gout = ldpcGPUDec(encout(:)); %check equality isequal(gout,cout(:))
方法处理多个数据帧NumFrames
基于gpu的维特比解码器系统对象的属性。对于Viterbi Decoder,不能从对象属性推断出系统的帧大小。因此,NumFrames
属性定义输入数据中显示的帧数。
numframes = 10;召集编码器= comm.ConvolutionalEncoder('TerminationMethod', 'Terminated');vitDecoder = comm.ViterbiDecoder('TerminationMethod', 'Terminated');使用NumFrames属性创建一个GPU维特比解码器。vitGPUDecoder = comm.gpu。ViterbiDecoder(“TerminationMethod”、“终止”,…NumFrames, NumFrames);MSG = randi([0 1], 200, numframes);for ii=1:numframes, convEncOut(:,ii) =1 -2* convcoder (msg(:,ii));end %Decode on the CPU for ii=1:numframes; cVitOut(:,ii) = vitDecoder(convEncOut(:,ii)); end %Decode on the GPU gVitOut = vitGPUDecoder(convEncOut(:)); isequal(gVitOut,cVitOut(:))
基于gpu的System对象接受典型的MATLAB数组或使用gpuArray
类。基于gpu的System对象支持双精度或单精度数据类万博1manbetx型的输入信号。输出信号从输入信号继承其数据类型。
如果输入信号是MATLAB数组,System对象处理CPU和GPU之间的数据传输。输出信号为MATLAB阵列。
如果输入信号是agpuArray
,数据将保留在GPU上。输出信号是agpuArray
.当物体被赋予一个gpuArray
,计算完全在GPU上进行,没有数据传输。通过gpuArray
参数通过减少模拟时间来提高性能。有关更多信息,请参见在GPU上建立阵列(并行计算工具箱).
将MATLAB数组传递给GPU System对象需要将初始数据从CPU传输到GPU。然后,GPU System对象执行计算并将输出数据传回CPU。这个过程引入了延迟。当数据以gpuArray的形式传递给GPU System对象时,该对象不会引起数据传输的延迟。因此,当你提供一个gpuArray作为输入时,GPU System对象运行得更快。
一般来说,在模拟中应该尽量减少CPU和GPU之间的数据传输量。
这个例子展示了如何将gpuArray传递给PSK调制器的输入,以减少延迟。
pskGPUModulator = comm.gpu.PSKModulator;X = randi([0 7], 1000, 1, '单身');gx = gpuArray (x);o = pskGPUModulator (x);类(o)释放(pskGPUModulator);%允许输入类型改变go = pskGPUModulator(gx);类(去)
comm.gpu.AWGNChannel
comm.gpu.BlockDeinterleaver
comm.gpu.BlockInterleaver
comm.gpu.convolutionaldeInterleaver
comm.gpu.ConvolutionalEncoder
comm.gpu.convolutionalinterleaver
comm.gpu.PSKDemodulator
comm.gpu.PSKModulator
comm.gpu.TurboDecoder
comm.gpu.ViterbiDecoder
GPU系统对象必须被模拟使用解释执行
.必须在块掩码上显式地选择此选项;默认值为代码生成
.