主要内容

通过MATLAB仿真加速编码器和并行计算工具箱

这个例子展示了两种方式来加速模拟通信算法的MATLAB®。它展示了使用MATLAB C代码生成运行时性能的影响和并行处理(使用MATLAB运行parfor(并行计算工具箱)功能)。全面看所有可能加速技术,知道了加速MATLAB算法和应用程序篇文章。

使用这些方法的综合效应可能会加速一个典型的模拟时间一个数量级。运行仿真的区别是相当于一夜之间或在几小时内。

MATLAB运行C代码生成的这个例子中,您必须MATLAB编码器™产品。运行的并行处理部分这个例子中,您必须并行计算工具箱™产品。

示例结构

这个示例检查各种实现收发机系统在MATLAB。

这个系统是由发射器,一个通道模型,和一个接收器。发射机的过程与卷积编码器输入比特流,一个衬垫,调制器,MIMO空时分组编码(见[1]、[2])。传输信号处理由一个2 x2 MIMO块衰落信道和加性高斯白噪声(AWGN)信道。其输入信号接收过程2 x2 MIMO空时分组解码器,解调器,deinterleaver和维特比译码器恢复的最佳估计在接收机输入比特流。

示例遵循此工作流:

  1. 创建一个函数运行的仿真算法

  2. 使用MATLAB GUI分析器来识别速度瓶颈

  3. 加快与MATLAB仿真C代码生成

  4. 使用并行处理实现更快的模拟运行

创建函数运行的仿真算法

从一个函数,表示第一个版本或基线算法的实现。输入到helperAccelBaseline函数是 E b / N o 当前帧的值(EbNo),最小数量的错误(minNumErr)和最大处理的比特数(maxNumBits)。 E b / N o 是每一点能量的比值,噪声功率谱密度。函数输出比特误码率(BER)信息 E b / N o 点。

类型helperAccelBaseline
函数数量= helperAccelBaseline (EbNo、minNumErr maxNumBits) = % helperAccelBaseline模拟通信链路%误码率helperAccelBaseline (EbNo, MINERR MAXBIT)返回的位错误%率(ber)通信链路,其中包括卷积编码、%交错,QAM调制,Alamouti时空分组码和%和AWGN MIMO块衰落信道。EBNO是%的每一点能量噪声功率谱密度比(Eb /不)AWGN信道在dB, % MINERR收集的最低数量是错误,和MAXBIT %最大数量的模拟部分,以便模拟不会无限期地%如果Eb /不值太高了。% 2011 - 2021版权MathWorks公司M = 16;% k = log2 (M)调制顺序;%每个符号位codeRate = 1/2;%的编码速率adjSNR = EbNo - 10 * log10 (1 / codeRate) + 10 * log10 (k);格子= poly2trellis (7 (171 133));tblen = 32;dataFrameLen = 1998;%添加6 0终止卷积码chanFrameLen = (dataFrameLen + 6) / codeRate; permvec=[1:3:chanFrameLen 2:3:chanFrameLen 3:3:chanFrameLen]'; ostbcEnc = comm.OSTBCEncoder(NumTransmitAntennas=2); ostbcComb = comm.OSTBCCombiner(NumTransmitAntennas=2,NumReceiveAntennas=2); mimoChan = comm.MIMOChannel(MaximumDopplerShift=0,PathGainsOutputPort=true); berCalc = comm.ErrorRate; % Run Simulation ber = zeros(3,1); while (ber(3) <= maxNumBits) && (ber(2) < minNumErr) data = [randi([0 1],dataFrameLen,1);false(6,1)]; encOut = convenc(data,trellis); % Convolutional Encoder intOut = intrlv(double(encOut),permvec'); % Interleaver modOut = qammod(intOut,M,... 'InputType','bit'); % QAM Modulator stbcOut = ostbcEnc(modOut); % Alamouti Space-Time Block Encoder [chanOut, pathGains] = mimoChan(stbcOut); % 2x2 MIMO Channel chEst = squeeze(sum(pathGains,2)); rcvd = awgn(chanOut,adjSNR,'measured'); % AWGN channel stbcDec = ostbcComb(rcvd,chEst); % Alamouti Space-Time Block Decoder demodOut = qamdemod(stbcDec,M,... 'OutputType','bit'); % QAM Demodulator deintOut = deintrlv(demodOut,permvec'); % Deinterleaver decOut = vitdec(deintOut(:),trellis, ... % Viterbi Decoder tblen,'term','hard'); ber = berCalc(decOut(1:dataFrameLen),data(1:dataFrameLen)); end

作为起始点,测量时间运行这个基线算法在MATLAB。使用MATLAB定时功能(抽搐toc)记录运行运行时完成加工的for循环遍历 E b / N o 值从0到7 dB。

minEbNodB = 0;maxEbNodB = 7;EbNoVec = minEbNodB: maxEbNodB;minNumErr = 100;maxNumBits = 1 e6;N = 1;str =“基线”;%的函数运行一次将它加载到内存和删除开销%运行时测量1 e4 helperAccelBaseline(10日);berBaseline = 0(大小(minEbNodB: maxEbNodB));disp (“处理基线算法”。);
处理基线算法。
抽搐;EbNoIdx = 1:长度(EbNoVec) EbNo = EbNoVec (EbNoIdx);y = helperAccelBaseline (EbNo minNumErr maxNumBits);berBaseline (EbNoIdx) = y (1);结束rtBaseline = toc;

结果表明仿真时间(以秒为单位)的基线算法。用这个时间测量与后续加速仿真运行时。

helperAccelReportResults (N, rtBaseline rtBaseline str, str);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -版本的收发机|运行时间(sec) |加速度比1。基线| 4.4886 | 1.0000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

通过使用MATLAB分析器的应用识别速度的瓶颈

确定基线算法的处理瓶颈和问题通过使用MATLAB分析器。获取配置文件信息通过执行以下脚本:

配置文件y = helperAccelBaseline(6100年,1 e6);配置文件配置文件查看器

性能分析报告介绍了为每个函数调用算法的执行时间。你可以根据他们的功能自拍降序排列。最初几个分析器窗口函数,描述了表示算法的速度瓶颈。在这种情况下,vitdec功能被确定为主要的速度瓶颈。

加速与MATLAB仿真C代码生成

MATLAB编码器生成便携和可读的C代码从算法的MATLAB代码生成子集。您可以创建一个MATLAB可执行(墨西哥人)helperAccelBaseline函数,因为它使用函数和系统支持代码生成的对象。金宝app使用codegen(MATLAB编码器)函数编译helperAccelBaseline功能为墨西哥人功能。由codegen成功代码生成后,您将看到一个墨西哥人文件在工作区中附加“_mex”功能,helperAccelBaseline_mex

codegen (“helperAccelBaseline.m”,“参数”,{EbNo、minNumErr maxNumBits})
代码生成成功。

测量的模拟时间墨西哥人版本的算法。记录花费的时间运行这个函数在同一循环。

N = N + 1;str =MATLAB C代码生成的;标签=“Codegen”;1 e4 helperAccelBaseline_mex(10日);berCodegen = 0(大小(berBaseline));disp (处理算法的墨西哥人的功能。);
处理的墨西哥人功能算法。
抽搐;EbNoIdx = 1:长度(EbNoVec) EbNo = EbNoVec (EbNoIdx);y = helperAccelBaseline_mex (EbNo minNumErr maxNumBits);berCodegen (EbNoIdx) = y (1);结束rt = toc;

这里的结果显示该算法运行速度比的墨西哥人版本基线版本的算法。加速实现的数量取决于算法的本质。最好的方法来确定加速度是使用MATLAB生成一个MEX-function编码器和测试的第一手加速。如果你的算法包含单精度的数据类型、定点数据类型,循环状态,或不能向量化的代码,你可能会看到加速效果。另一方面,如果你的算法包含MATLAB隐式多线程计算等fft圣言会、函数调用IPP或布拉斯特区库函数优化执行fft算法等在MATLAB上电脑或算法,您可以vectorize代码,加速效果是不可能的。

helperAccelReportResults (N, rtBaseline, rt、str标记);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -版本的收发机|运行时间(sec) |加速度比1。基线| 4.4886 | 1.0000 2。MATLAB与C代码生成| 1.6402 | 2.7367 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

使用并行处理实现更快的模拟运行

利用多核并行仿真加速度增加运行任务。使用并行处理运行(parfor在MATLAB来执行工作循环)可用的工人的数量。并行计算工具使您能够运行不同的迭代并行仿真。使用gcp(并行计算工具箱)函数来获取当前并行池。如果池可用但不开放,gcp打开池和储备一些MATLAB工人执行后续的迭代parfor循环。在这个例子中,六名工人MATLAB客户机机器上本地运行。

池= gcp
池= ProcessPool属性:连接:真NumWorkers: 6集群:本地AttachedFiles: {} AutoAddClientPath:真正的IdleTimeout: 30分钟(剩余5分钟)SpmdEnabled:真的

平行于Eb /没有值

运行 E b / N o 点并行使用六个工人使用parfor循环而不是一个for循环在前面的情况下使用。测量仿真时间。

N = N + 1;str =并行与parfor Eb /不运行的;标签=“Parfor Eb /不”;1 e4 helperAccelBaseline_mex(10日);berParfor1 = 0(大小(berBaseline));disp (“处理算法的墨西哥人函数在一个parfor-loop。”);
处理在parfor-loop算法的墨西哥人的功能。
抽搐;parforEbNoIdx = 1:长度(EbNoVec) EbNo = EbNoVec (EbNoIdx);y = helperAccelBaseline_mex (EbNo minNumErr maxNumBits);berParfor1 (EbNoIdx) = y (1);结束rt = toc;

墨西哥人的结果增加了仿真时间内执行版本的算法parfor循环的结果。请注意,在通过运行算法parfor循环,完成仿真运行时间短。的基本概念parforMATLAB循环回路是一样的标准。所不同的是,parfor循环迭代分为团体,每个工人总数的一部分执行迭代。因为几个MATLAB工人在同一循环,可以同时计算parfor循环提供了更好的性能比普通串行循环。

helperAccelReportResults (N, rtBaseline, rt、str标记);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -版本的收发机|运行时间(sec) |加速度比1。基线| 4.4886 | 1.0000 2。MATLAB与C代码生成| 1.6402 | 2.7367 3。并行运行与parfor Eb /不| 1.0943 | 4.1020 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

平行的比特数

在前面的小节中,总的仿真时间主要是由最高 E b / N o 点。您可以进一步加速模拟通过分割模拟的比特数 E b / N o 点的工人。运行每个 E b / N o 点并行使用六个工人使用parfor循环。测量仿真时间。

N = N + 1;str =“并行运行与parfor的比特数”;标签=“Parfor #位”;1 e4 helperAccelBaseline_mex(10日);berParfor2 = 0(大小(berBaseline));disp (“处理算法的墨西哥人第二个版本的函数在一个parfor-loop。”);
处理算法的墨西哥人第二个版本的函数在一个parfor-loop。
抽搐;%计算模拟在每个工人的比特数minNumErrPerWorker = minNumErr / pool.NumWorkers;maxNumBitsPerWorker = maxNumBits / pool.NumWorkers;EbNoIdx = 1:长度(EbNoVec) EbNo = EbNoVec (EbNoIdx);numErr = 0 (pool.NumWorkers, 1);parforw = 1:池。NumWorkers y=helperAccelBaseline_mex(EbNo,minNumErrPerWorker,maxNumBitsPerWorker); numErr(w)=y(2); numBits(w)=y(3);结束berParfor2 (EbNoIdx) = (numErr) /金额总和(numBits);结束rt = toc;

墨西哥人的结果增加了仿真时间内执行版本的算法parfor循环,这一次每个工人模拟相同的 E b / N o 点。注意,通过运行这个版本中parfor循环得到最快的模拟性能。所不同的是,parfor把需要模拟的比特数的工人。这种方法能减少仿真时间甚至最高 E b / N o 通过均匀分布载荷(具体来说,模拟的比特数)/工人。

helperAccelReportResults (N, rtBaseline, rt、str标记);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -版本的收发机|运行时间(sec) |加速度比1。基线| 4.4886 | 1.0000 2。MATLAB与C代码生成| 1.6402 | 2.7367 3。并行运行与parfor Eb /不| 1.0943 | 4.1020 4。与parfor并行运行的比特数| 0.6501 | 6.9043 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

总结

你可以显著加快模拟通信算法的MATLAB的C代码生成和并行处理。

  • MATLAB与C代码生成加速仿真通过锁定数据类型和大小的每个变量和通过减少开销的解释语言,检查尺寸和数据类型的变量在代码的每一行。

  • 并行处理可以大大加快仿真通过计算不同的迭代运行的并行算法的MATLAB的工人。

  • 并行每个 E b / N o 点分别可以进一步加速,加速甚至最长的运行 E b / N o 点。

下面显示了运行时的所有四个方法作为一个条形图。结果可能会有所不同根据特定算法,可用的工人,和选择的最小数量的错误和最大的比特数。

结果= helperAccelReportResults;

这张图显示了不同的模拟处理方法的误码率曲线密切相互匹配。为每一个策划 E b / N 0 的四个版本的算法运行的最大数量输入位设置为一千万(maxNumBits= 1 e7)和最小数量的比特错误设置为五千(minNumErr= 5000)。

进一步的探索

下面的例子使用了gcp功能储备几个MATLAB工人MATLAB客户端机器上本地运行。通过修改并行配置,您可以进一步加速仿真通过运行该算法在更大的集群的工人不MATLAB客户机。如何管理和使用的描述并行配置,看到发现集群和集群配置文件使用(并行计算工具箱)的话题。

在本例中使用以下功能。

选择引用

  1. s . m . Alamouti”,一个简单的无线通信的发射分集技术,”IEEE®在选定地区通讯》杂志上,16卷,不。8日,第1458 - 1451页,1998年10月。

  2. 诉Tarokh h . Jafarkhami, a . r . Calderbank“从正交空时分组码的设计,”IEEE信息理论,45卷,不。5,页1456 - 1467,1999年7月。