主要内容

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

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

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

此示例特性的系统对象可在“通信工具箱™”产品中访问。为了运行本示例的MATLAB to C代码生成部分,您必须拥有MATLAB Coder™许可证。为了运行此示例的并行处理部分,您必须拥有并行计算工具箱™许可证。

简介

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

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

实例结构

本例的工作流程如下:

  1. 从基于函数的算法开始作为基线

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

  3. 使用系统对象提高模拟时间

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

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

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

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

类型commaccelerationbaseline

作为起点,测量在MATLAB中运行此基线算法所需的时间。使用MATLAB计时函数(tic和toc)来记录运行此函数所需的时间,因为它在迭代Eb/No值从0到7 dB的for循环中被调用。

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分析器GUI识别速度瓶颈

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

配置文件y = commaccelerationbaseline (EbNo 1 e5);配置文件

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

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

函数commaccelerationsystemobjects实现了该算法的第二个版本,它使用了通信工具箱中的System对象。在此算法的基线版本中发现的10个函数调用中,有9个调用被对可用System对象的相应调用所取代。生成的commaccelerationsystemobjects函数由两个不同的部分组成:

  • 声明,该声明创建System对象

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

类型commaccelerationsystemobjects

测量这个算法版本的仿真时间。记录在相同的for循环中运行此函数所花费的时间。

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

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

commaccelerationreportresults (N, a, b, str);

用MATLAB加速模拟生成C代码

MATLAB Coder从属于MATLAB代码生成子集的算法生成可移植和可读的C代码。函数commaccelerationsystemobjects,算法的第二个版本,使用支持MATLAB Coder代码生成的系统对象。金宝app因此,该算法可以编译并链接到MATLAB中作为MEX (MATLAB可执行)函数。使用MATLAB Coder codegen命令将算法的系统对象版本编译为MEX函数(称为commaccelerationsystemobjects_mex)。

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

codegen (“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对象的算法是高度优化的,但是代码生成可以通过锁定函数内变量的大小和数据类型来加速模拟。这个过程使执行更有效,因为它消除了解释语言的开销,即在代码的每一行中检查大小和数据类型。

commaccelerationreportresults (N, a, c, str);

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

利用多核通过并行运行任务来增加模拟加速。使用并行处理运行(parfor循环)在MATLAB中执行的工作上可用的工人的数量。“并行计算工具箱”使您能够并行地运行模拟的不同迭代。使用parpool函数保留一些MATLAB工作者,用于执行后续的parfor循环。在这个例子中,两个worker在MATLAB客户端机器上本地运行。

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

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

方法中执行的算法的MEX版本的仿真时间parfor-loop而不是前面使用的for循环。

N = 4;str =parfor并行模拟运行;commaccelerationsystemobjects_mex (EbNo 1 e4);berPct = 0(大小(berBaseline));流(1,'在parfor循环中处理算法的第二个版本的MEX函数。\n');抽搐;parforEbNo = 0: MaxSNRdB y = commaccelerationsystemobjects_mex (EbNo MaxNumBits);berPct (EbNo + 1) = y;结束d = toc;

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

commaccelerationreportresults (N、d str);

总结

综合影响

  • 系统对象,

  • 用MATLAB编写C代码并生成

  • 并行处理运行

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

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

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

  • 并行处理运行可以通过在大量可用的MATLAB worker上并发计算算法的不同迭代来大大加速仿真。

进一步的探索

在本例中,我们使用函数parpool来预留一些在我们的MATLAB客户端机器上本地运行的MATLAB worker。通过修改并行配置,可以在不在MATLAB客户端机器上的更大的工作集群上运行算法,从而进一步加速模拟。有关如何管理和使用并行配置的说明,请参阅并行计算工具箱用户指南的“使用用户配置编程”页。

数值性能说明

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

附录

本例中使用了以下函数。

选择引用

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

  2. V. Tarokh, H. Jafarkhami和A. R. Calderbank,“正交设计中的时空分组码”,IEEE信息论汇刊,第45卷,no。5,第1456-1467页,1999年7月。