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

此示例显示了三种方法,可以加速MATLAB®中的通信算法仿真。特别是,它展示了使用系统对象,Matlab到C代码生成和并行处理运行的影响(使用MATLAB)议案功能)具有仿真速度。

使用这些方法的组合效果可以通过幅度升高典型的模拟时间。不同的差异是无异于在一夜之间运行模拟或在几个小时内运行模拟。

系统对象此示例功能可用于通信工具箱™产品。要将MATLAB运行到此示例的C代码生成部分,您必须具有MATLAB编码器™许可证。为了运行此示例的并行处理部分,您必须具有并行计算工具箱™许可证。

介绍

此示例检查以下收发器系统的各种实现:

该系统由发射器,信道模型和接收器组成。发射机使用卷积编码器,交织器,调制器和MIMO空间 - 时间块编码器处理输入比特流[1],[2]。然后通过2x2 MIMO信道和添加白色高斯噪声(AWGN)信道来处理发送的信号。接收器利用2x2MIMO空间 - 时块解码器,解调器,解交织器和维特比解码器处理其输入信号,以恢复接收器处的输入比特流的最佳估计。

例子

此示例的工作流程如下:

  1. 以基于函数为基准的算法开始

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

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

  4. 加速MATLAB到C代码生成的模拟

  5. 使用并行处理运行实现甚至更快的仿真

以基于函数为基准的算法开始

从代表该算法的第一个版本或基线实现的函数开始。commaCcelerationBaseline函数的输入是当前帧(EBNO)的EB / No值以及算法进程(MaxNumbits)的比特数。EB / NO是每位能量与噪声功率谱密度的比率。功能输出是算法的误码率(BER)。请注意,基线算法实现使用来自通信工具箱的函数和数据对象以及一些用户定义的函数,例如localmimoencoder,localmimodeCoder和localMimoChannel。

类型CommAccelerationBaseline.

作为起点,测量在MATLAB中运行此基线算法所需的时间。使用MATLAB定时函数(TIC和TOC)记录运行此函数的经过时间,因为它在循环中被调用,可在0到7 dB中迭代EB / NO值。

maxsnrdb = 7; eBno = 1; maxnumbits = 2e5;n = 1; str ='基线';CommAccelerationBaseline(EBNO,1E4);Berbaseline = Zeros(大小(0:maxsnrdb));FPRINTF(1,'处理基线算法。\ n');tic;为了EBNO = 0:MAXSNRDB Y = CommAccelerationBaseline(EBNO,MAXNUMBITS);Berbaseline(EBNO + 1)= Y;结尾a = toc;

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

CommAccelerationReportResults(n,a,a,str);

使用Matlab Profiler GUI识别速度瓶颈

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

轮廓Y = CommaCcelerationBaseline(EBNO,1E5);轮廓离开

分布商报告以降序为算法的每个函数调用的执行时间。Profiler窗口描绘的前几个功能代表了算法的速度瓶颈。在这种情况下,两个用户定义的函数(LocalMimodeCoder和LocalMimoChannel)和Vitdec函数(工具箱的维特比解码器功能)被识别为主要速度瓶颈。

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

函数commaccelerationsystemobjects实现了算法的第二个版本,它使用来自通信工具箱的系统对象。在该算法的基线版本中找到的十个函数调用中,将九个呼叫替换为可用系统对象的相应呼叫。生成的commaAccelerationsystemObjects函数由两个不同的部分组成:

  • 声明,它创建系统对象

  • 执行,呼叫每个系统对象™的步骤方法以执行特定操作。

类型commaccelerationsystemobjects.

测量此版本的算法的模拟时间。记录以前循环运行此函数的经过时间。

n = 2;str ='使用系统对象';CommAccelerationsystemObjects(EBNO,1E4);bersystemobject = zeros(大小(berbaseline));FPRINTF(1,'处理算法的系统对象版本。\ n');tic;为了eBno = 0:maxsnrdb y = commaccelerationsystemobjects(ebno,maxnumbits);BersystemObject(EBNO + 1)= Y;结尾b = toc;

结果显示了算法的系统对象版本的模拟时间。请注意,通过将呼叫替换对系统对象的调用,算法运行得更快。预期此行为是因为使用系统对象的一个​​优点是效率。使用System对象的算法单独执行声明,避免了基于功能的算法中的重复输入验证和验证程序。使用系统对象的算法实现仅在循环之外执行参数处理和初始化,并利用系统对象的高效MEX实现,从而提高了整体仿真性能。

commaccelerationreportresults(n,a,b,str);

加速MATLAB到C代码生成的模拟

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

注意:您必须拥有MATLAB编码器许可证来运行该示例的此部分。

Codegen('commaccelerationsystemobjects.m''-args',{eBno,maxnumbits})

测量MEX版本的算法的仿真时间。记录以前循环运行此函数的经过时间。

n = 3;str ='Matlab到C代码生成';CommAccelerationsystemObjects_mex(EBNO,1E4);bercodegen = zeros(大小(berbaseline));FPRINTF(1,'处理第二个版本的算法的MEX函数。\ n');tic;为了eBno = 0:maxsnrdb y = commaccelerationsystemobjects_mex(ebno,maxnumbits);Bercodegen(EBNO + 1)= Y;结尾c = toc;

结果显示了算法的MEX版本的模拟时间。请注意,通过将系统对象算法编译为MEX函数,MEX版本的算法比算法的第二个和基线版本速度快。预期此行为是因为使用MATLAB到C代码生成的优点之一是模拟加速。虽然使用系统对象的算法经过高度优化,但代码生成可以通过锁定功能内的尺寸和数据类型来加速模拟。此过程使执行更有效,因为它会删除解释语言的开销,这些语言在代码的每一行中检查大小和数据类型。

CommAccelerationReportresults(n,a,c,str);

使用并行处理运行实现甚至更快的仿真

利用多个核心通过并行运行任务来提高模拟加速度。使用并行处理运行(议案循环)在Matlab中履行可用工人数量的工作。并行计算工具箱使您可以并行运行模拟的不同迭代。使用parpool.函数来保留一些Matlab工人执行后续的工作人员议案-环形。在此示例中,两个工人在Matlab客户端计算机上本地运行。

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

如果Isempty(GCP('noicreate')),Parpool;结尾

测量在a内执行的算法的MEX版本的模拟时间议案-loop而不是上一个案例中使用的for-loop。

n = 4;str =“并行模拟与玻璃套管运行;CommAccelerationsystemObjects_mex(EBNO,1E4);berpct =零(大小(berbaseline));FPRINTF(1,'处理第二个版本的算法的MEX函数在一个循环中。\ n');tic;议案eBno = 0:maxsnrdb y = commaccelerationsystemobjects_mex(ebno,maxnumbits);berpct(eBno + 1)= y;结尾d = toc;

结果显示了在a内执行的第二算法的MEX版本的模拟时间议案-环形。请注意,通过运行此版本议案- 我们获得最快的模拟性能。一个基本的概念议案-loop与标准MATLAB for-loop相同。不同的是议案将循环迭代划分为组,以便每个工作人员执行迭代总数的某些部分。因为几名MATLAB工人可以同时在同一循环上同时计算议案-Loop提供比其类似的循环更好的性能。

commaCcelerationReportresults(n,a,d,str);

概括

综合影响

  • 系统对象,

  • MATLAB到C代码生成和

  • 并行处理运行

可以显着加速您的通信算法的模拟。

  • 系统对象通过利用系统对象的高效MEX实现,通过避免在基于功能的算法中找到的重复输入验证和验证例程来帮助改善仿真速度。

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

  • 并行处理运行可以通过在多个可用的Matlab工人上计算算法的不同迭代基本上加速仿真。

进一步的探索

在此示例中,我们使用该功能parpool.保留在我们的Matlab客户端计算机上本地运行的许多Matlab工人。通过修改并行配置,您可以通过在不在Matlab客户端计算机上的较大的工人上运行算法来进一步加速模拟。有关如何管理和使用并行配置的说明,请参阅“使用”并行计算工具箱用户指南“的”用户配置“页面编程。

关于数值的说明

在此示例中,算法的基线和系统对象版本不是数值相同的。基线算法中使用的用户定义的函数LocalMimodeCoder实现了比算法的第二版本的Comm.OstbCombiner系统对象中使用的MIMO空间块解码操作略微不同的版本。尽管如此,当您使用足够大量的输入位运行算法的前三个版本(基线版本,系统对象版本和MEX功能)时,您将获得非常相似的BER曲线指示不同版本的算法的类似数值性能。在这里,通过将三个版本的算法中的每一个利用设置为10百万(即maxnumbits = 1e7),找到通过运行三个算法中的每一个获得的BER曲线。

附录

在此示例中使用以下功能。

选定的参考文献

  1. S. M. Alamouti,“一种简单的无线通信传输多样性技术”IEEE®期刊在通信中的选定区域,卷。16,不。8,PP。1998年10月1451-1458。

  2. V.Tarokh,H. Jafarkhami和A. R. Calderbank,“来自正交设计的时空块代码”,信息理论上的IEEE交易,卷。45,不。5,PP。1999年7月1456-1467。