模拟使用gpu加速
基于gpu的系统对象
基于gpu的系统对象的外观和行为就像其他系统中的对象通信工具箱™产品。最重要的区别在于,算法执行图形处理单元(GPU)而非一个CPU。使用GPU可以加速你的模拟。
系统对象的通信产品位于工具箱通讯
包和构造:
H =通讯。<对象名称>
例如,维特比译码器系统对象™是构造成:
H = comm.ViterbiDecoder
在这种情况下,相应的基于gpu实现系统对象存在,它们位于comm.gpu
包和构造成:
H = comm.gpu。<对象名称>
例如,一个基于gpu的维特比译码器系统对象构造成:
H = comm.gpu.ViterbiDecoder
看到可用的基于gpu实现输入列表帮助通讯
在MATLAB®命令行并单击GPU实现。
使用gpu通用指南
图形处理单元(gpu)擅长处理大量的数据和执行计算高强度计算。处理大量的数据是一种最大化吞吐量的GPU在一个模拟世界中。GPU处理的数据的数量在任何时候的大小取决于GPU系统的数据传递到输入对象。因此,最大化数据大小的一种方法是通过处理多个帧的数据。
您可以使用一个GPU系统对象同时处理多个数据帧或并行。这不同于许多标准的方式,或non-GPU,实现系统对象。GPU系统对象,进程框架对象的数量在一个调用目标函数是一个隐含的对象属性或显式声明使用NumFrames
对象的属性。
传输使用BPSK调制和涡轮的编码和解码
这个例子展示了如何传送turbo-encoded BPSK-modulated AWGN信道的数据块。然后,它显示了如何使用一个迭代解码turbo译码器和显示错误。
定义一个噪声变量,建立帧长度为256,使用随机流属性是可重复的结果。
noiseVar = 4;frmLen = 256;s = RandStream (“mt19937ar”,“种子”11);intrlvrIndices = randperm(年代,frmLen);
创建一个涡轮编码器系统对象。组成的格子结构卷积码是poly2trellis (4 [13 15 17] 13)。的InterleaverIndices
属性指定的映射对象用来交换输入位编码器作为一个列向量的整数。
turboEnc = comm.TurboEncoder (“TrellisStructure”poly2trellis (4…15 17 [13],13)“InterleaverIndices”,intrlvrIndices);
创建一个BPSK调制系统对象。
bpsk = comm.BPSKModulator;
创建一个AWGN信道系统对象。
频道= comm.AWGNChannel (“NoiseMethod”,“方差”,“方差”,…noiseVar);
创建一个基于gpu的Turbo译码器系统对象。组成的格子结构卷积码是poly2trellis (4 [13 15 17] 13)。的InterleaverIndicies
属性指定的映射对象用来交换输入位编码器作为一个列向量的整数。
turboDec = comm.gpu.TurboDecoder (“TrellisStructure”poly2trellis (4…15 17 [13],13)“InterleaverIndices”intrlvrIndices,…“NumIterations”4);
创建一个错误率系统对象。
errorRate = comm.ErrorRate;
运行仿真。
为frmIdx = = randi 1:8数据([0,1],frmLen, 1);encodedData = turboEnc(数据);modSignal = bpsk (encodedData);receivedSignal =通道(modSignal);
接收到的信号转换为对数似比解码。
receivedBits = turboDec (2 / (noiseVar / 2)) *实际(receivedSignal));
比较原始的数据和接收的数据,然后计算出错率的结果。
errorStats = errorRate(数据、receivedBits);结束流('出错率= % f \ nNumber错误= % d \ nTotal比特= % d \ n ',…errorStats errorStats (1) (2), errorStats (3))
使用GPU处理多个数据帧
这个例子展示了如何使用一个同时处理两个数据帧LDPC译码器系统对象。的ParityCheckMatrix
属性决定了帧大小。帧的数量的对象过程是由帧大小和输入数据向量的长度。
numframes = 2;ldpcEnc = comm.LDPCEncoder;ldpcGPUDec = comm.gpu.LDPCDecoder;ldpcDec = comm.LDPCDecoder;味精=兰迪([0,1],32400,2);2 = 1:numframes encout(:,(二)= ldpcEnc(味精(:,ii));结束%单端双相(llr) encout = 1 - 2 * encout;%解码在CPU上2 = 1:numframes;cout (:, ii) = ldpcDec (encout(:,(二));结束在GPU痛风= %多帧解码ldpcGPUDec (encout (:)); %check equality isequal(gout,cout(:))
处理多个数据帧使用NumFrames财产
这个例子显示了如何处理多个数据帧使用NumFrames
基于gpu的维特比译码器系统的属性对象。维特比译码器,无法推断出系统的帧的大小从一个对象属性。因此,NumFrames
属性定义了框架出现在输入数据的数量。
numframes = 10;convEncoder = comm.ConvolutionalEncoder (“TerminationMethod”、“终止”);vitDecoder = comm.ViterbiDecoder (“TerminationMethod”、“终止”);%创建一个GPU维特比译码器,使用NumFrames财产。vitGPUDecoder = comm.gpu。ViterbiDecoder (“TerminationMethod”、“终止”,…NumFrames, NumFrames);味精=兰迪([0,1],200年,numframes);2 = 1:numframes convEncOut(:,(二)= 1 - 2 * convEncoder(味精(:,ii));结束%解码在CPU上2 = 1:numframes; cVitOut(:,ii) = vitDecoder(convEncOut(:,ii)); end %Decode on the GPU gVitOut = vitGPUDecoder(convEncOut(:)); isequal(gVitOut,cVitOut(:))
gpuArray和定期MATLAB数值数组
一个基于gpu的系统对象接受典型的MATLAB使用创建的数组或对象gpuArray
类。一个基于gpu的系统对象支持输入信号双或单精度的数据金宝app类型。输出信号继承了其数据类型从输入信号。
如果输入信号是MATLAB数组,系统对象处理CPU和GPU之间的数据传输。输出信号是一个MATLAB数组。
如果输入信号
gpuArray
,数据仍然在GPU上。是一个输出信号gpuArray
。当对象是给定一个gpuArray
,计算完全发生在GPU,没有数据传输发生。通过gpuArray
参数提供了提高性能通过减少模拟时间。有关更多信息,请参见建立数组GPU(并行计算工具箱)。
通过MATLAB GPU系统对象数组需要转移从CPU与GPU的初始数据。然后,GPU系统对象输出数据执行计算和传输回CPU。这个过程介绍了延迟。当数据的形式gpuArray GPU系统传递对象,对象不产生数据传输的延迟。因此,GPU系统对象跑得快,当你提供一个gpuArray作为输入。
一般来说,应该尽量减少传输的数据量在CPU和GPU之间在你的模拟。
通过gpuArray作为输入
这个例子展示了如何通过gpuArray相移键控调制器的输入,减少延迟。
pskGPUModulator = comm.gpu.PSKModulator;x =兰迪([0 7],1000年,1,'单');gx = gpuArray (x);o = pskGPUModulator (x);类(o)释放(pskGPUModulator);%允许输入类型改变去= pskGPUModulator (gx);类(去)
块支持GPU系统对象金宝app
系统支持GPU系统对象金宝app
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系统对象的局限性
必须模拟使用GPU系统对象解释执行
。你必须选择这个选项显式块面具;默认值是代码生成
。
相关的话题
- GPU的功能和性能(并行计算工具箱)