主要内容

仿真加速使用系统对象,MATLAB编码器和并行计算工具箱

这个例子展示了在MATLAB®中加速通信算法仿真的三种方法。特别地,它展示了使用System对象、MATLAB到C代码生成和并行处理运行(使用MATLAB)的效果帕弗功能)对模拟速度有影响。

使用这些方法的综合效果可能会将典型模拟时间加快一个数量级。这种差异相当于在一夜之间或几小时内运行模拟。

此示例功能的系统对象可在“通信工具箱”中访问™ 产品。为了运行本例中的MATLAB到C代码生成部分,您必须有一个MATLAB编码器™ 执照。为了运行本例的并行处理部分,您必须拥有并行计算工具箱™ 执照。

介绍

这个例子检查了以下收发器系统的各种实现:

该系统由发射机、信道模型和接收机组成。发射机用卷积编码器、交织器、调制器和MIMO空时分组编码器处理输入比特流[1], [2].传输信号通过2x2 MIMO通道和加性高斯白噪声(AWGN)通道进行处理。接收机用2x2 MIMO空时块解码器、解调器、解交错器和维特比解码器处理其输入信号,以恢复接收机输入比特流的最佳估计。

示例的结构

本示例的工作流程如下:

  1. 以基于函数的算法作为基线

  2. 使用MATLAB Profiler GUI识别速度瓶颈

  3. 使用System对象提高仿真时间

  4. 用MATLAB加速仿真到C代码的生成

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

以基于函数的算法作为基线

从表示该算法的第一个版本或基线实现的函数开始。commaccelerationbaseline函数的输入是当前帧的Eb/No值(EbNo)和算法处理的比特数(MaxNumBits)。Eb/No为每位能量与噪声功率谱密度之比。函数输出是算法的误码率(BER)。注意,基线算法实现使用通信工具箱中的函数和数据对象,以及一些用户定义的函数,如localmimoencoder、localmimodecoder和localmimochannel。

类型通信加速基线

作为起点,测量在MATLAB中运行这个基线算法所需的时间。使用MATLAB定时函数(tic和toc)来记录运行该函数的消耗时间,因为它是在for循环中调用的,该循环遍历从0到7 dB的Eb/No值。

MaxSNRdB = 7, EbNo = 1; MaxNumBits = 2 e5;N = 1; str =“基线”;commaccelerationbaseline (EbNo 1 e4);berBaseline = 0(大小(0:MaxSNRdB));流(1,“处理基线算法。\n”); 抽搐;EbNo=0:MaxSNRdB y=commaccelerationbaseline(EbNo,MaxNumBits);berBaseline(EbNo+1)=y;结束一个= toc;

结果显示了基线算法的仿真时间(以秒为单位)。用这个度量作为标准,与该算法的后续版本进行比较。

commaccelerationreportresults (N, a, a, str);

使用MATLAB Profiler GUI识别速度瓶颈

使用MATLAB Profiler确定基线算法的处理瓶颈和问题区域。执行以下脚本获取分析器信息:

轮廓y=通信加速基线(EbNo,1e5);配置文件

这个性能分析报告按降序显示算法的每个函数调用的执行时间。Profiler窗口所描述的前几个函数代表了算法的速度瓶颈。在这种情况下,两个用户定义函数(localmimodecoder和localmimochannel)和vitdec函数(工具箱中的Viterbi解码器函数)被确定为主要的速度瓶颈。

使用系统对象提高仿真时间

函数commaccelerationsystemobjects实现了该算法的第二个版本,该版本使用通信工具箱中的系统对象。在该算法的基线版本中找到的十个函数调用中,有九个调用被对可用系统对象的相应调用所取代。生成的commaccelerationsystemobjects函数离子由两个不同的部分组成:

  • 声明,它创建System对象

  • 执行,它调用每个System对象™的step方法以执行特定的操作。

类型commaccelerationsystemobjects

测量此版本算法的模拟时间。在与前面相同的for循环中记录运行此函数所用的时间。

N=2;str=使用系统对象的;commaccelerationsystemobjects (EbNo 1 e4);berSystemobject = 0(大小(berBaseline));流(1,'处理算法的System对象版本。\n'); 抽搐;EbNo=0:MaxSNRdB y=通信加速系统对象(EbNo,MaxNumBits);berSystemobject(EbNo+1)=y;结束b=总有机碳;

结果显示了该算法的System对象版本的仿真时间。注意,通过将函数调用替换为对System对象的调用,算法运行得更快。这种行为是预期的,因为使用System对象的优点之一是效率。使用System对象的算法将声明与执行分开,这避免了在基于函数的算法中发现的重复输入验证和验证例程。使用System对象的算法实现只在循环外部执行一次参数处理和初始化,并利用了System对象的有效MEX实现,从而提高了整体仿真性能。

commaccelerationreportresults (N, a, b, str);

用MATLAB加速C代码生成的仿真

MATLAB编码器生成可移植和可读的C代码,从算法,是MATLAB代码生成子集的一部分。该算法的第二个版本commaccelerationsystemobjects函数使用支持MATLAB Coder代码生成的System对象。万博1manbetx因此,该算法可以作为一个MEX (MATLAB可执行)函数编译并链接到MATLAB中。使用MATLAB Coder codegen命令将算法的System对象版本编译为一个MEX函数(称为commaccelerationsystemobjects_mex)。

注意:您必须拥有MATLAB编码器许可证才能运行示例的这一部分。

编码基因(“commaccelerationsystemobjects.m”,“参数”, {EbNo, MaxNumBits})

测量算法MEX版本的仿真时间。记录在同一个for循环中运行此函数所需的时间。

N=3;str=MATLAB到C的代码生成;commaccelerationsystemobjects_mex (EbNo 1 e4);berCodegen = 0(大小(berBaseline));流(1,'处理第二版算法的MEX函数。\n'); 抽搐;EbNo = 0: MaxSNRdB y = commaccelerationsystemobjects_mex (EbNo MaxNumBits);berCodegen (EbNo + 1) = y;结束c = toc;

结果显示了该算法的MEX版本的仿真时间。注意,通过将System对象算法编译为MEX函数,该算法的MEX版本的运行速度比该算法的第二个版本和基线版本都要快。这种行为是预期的,因为使用MATLAB到C代码生成的优势之一是模拟加速。尽管使用System对象的算法是高度优化的,但代码生成可以通过锁定函数内部变量的大小和数据类型来加速模拟。这个过程使执行更加高效,因为它消除了解释语言检查每一行代码的大小和数据类型的开销。

通信加速报告结果(N、a、c、str);

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

利用多个核,通过并行运行任务来增加模拟加速。使用并行处理运行(帕弗循环)以根据可用工人的数量执行工作。并行计算工具箱使您能够并行运行不同的模拟迭代。使用帕尔普函数来保留一些MATLAB工作程序,以便执行后续的帕弗循环。在本例中,两个工作人员在MATLAB客户机上本地运行。

注意:您必须有并行计算工具箱许可证才能运行示例的这一部分。

如果isempty (gcp (“nocreate”parpool));结束

度量算法的MEX版本的仿真时间帕弗-loop而不是前面使用的for循环。

N = 4;str =“与parfor并行模拟运行”; 通信加速系统对象(EbNo,1e4);berPct=零(尺寸(BERB基线));FPRITF(1,'在parfor循环中处理第二版算法的MEX函数。\n'); 抽搐;帕弗EbNo = 0: MaxSNRdB y = commaccelerationsystemobjects_mex (EbNo MaxNumBits);berPct (EbNo + 1) = y;结束d = toc;

结果显示了第二个算法的MEX版本在一段时间内执行的模拟时间帕弗循环。请注意,通过在帕弗-loop我们得到最快的模拟性能。a的基本概念帕弗-loop与标准MATLAB for loop相同。区别在于帕弗将循环迭代划分为组,以便每个工作人员执行总迭代数的一部分。由于几个MATLAB工作人员可以在同一个循环上并发计算,因此,a帕弗-loop比类似的for循环提供了明显更好的性能。

commaccelerationreportresults (N、d str);

总结

综合效应

  • 系统对象,

  • MATLAB到C代码的生成与实现

  • 并行处理运行

可以显著加快通信算法的模拟。

  • 系统对象通过仅在执行循环外执行一次参数处理和初始化、利用系统对象的高效MEX实现以及避免基于函数的算法中出现的重复输入验证和验证例程,帮助提高模拟速度。

  • MATLAB到C的代码生成通过锁定每个变量的数据类型和大小以及减少解释语言的开销来加速模拟,解释语言检查每一行代码中变量的大小和数据类型。

  • 并行处理运行可以通过在大量可用的MATLAB工作人员上同时计算算法的不同迭代来大大加快仿真速度。

进一步的探索

在这个例子中,我们使用了这个函数帕尔普以保留一些在我们的MATLAB客户端机器上本地运行的MATLAB工作者。通过修改并行配置,您可以在不在您的MATLAB客户机上的更大的工作集群上运行算法,从而进一步加速模拟。有关如何管理和使用并行配置的描述,请参阅并行计算工具箱用户指南的“使用用户配置编程”页面。

数值性能说明

在本例中,算法的基线版本和系统对象版本在数值上不相同。基线算法中使用的用户定义函数localmimodecoder实现的MIMO空时块解码操作版本与第二版本算法的comm.OSTBCCombiner系统对象中使用的版本略有不同。然而,当您使用足够多的输入位运行算法的前三个版本(基线版本、系统对象版本和第二个版本的MEX函数)中的每一个时,您将获得非常相似的BER曲线,表明不同版本的算法具有相似的数值性能。在这里,您可以找到通过在输入位数设置为千万(即MaxNumBits=1e7)的情况下运行三个版本的算法获得的BER曲线。

附录

本例中使用了以下函数。

选定的参考资料

  1. S.M.Alamouti,“一种用于无线通信的简单发射分集技术,”IEEE®通信选定领域期刊,第16卷,第5期。8、1998年10月第1451-1458页。

  2. V. Tarokh, H. Jafarkhami, A. R. Calderbank,《来自正交设计的时空块代码》,IEEE信息论学报,第45卷,第5期,第1456-1467页,1999年7月。