使用模型顾问优化生成的代码

您可以使用Simulink万博1manbetx®Model Advisor来帮助您配置定点模型,以实现更有效的设计并优化生成的代码。使用Model Advisor检查定点模型:

  1. 建模在要分析的模型的选项卡上,单击模型的顾问

  2. 在系统选择器中,选择要分析的系统。

  3. 在Model Advisor左侧窗格中,展开副产品节点,然后嵌入式编码器节点。

  4. 对于定点代码生成,最重要的复选框是识别生成昂贵的定点和饱和代码的块,确定有问题的定点操作,识别生成昂贵舍入代码的块检查硬件实现

    要启用与选定节点关联的所有Model Advisor检查,请从Model Advisor编辑菜单中,选择全选

  5. 点击选择运行检查。有关提高定点模型效率的任何提示都将显示在“模型顾问”窗口中。

接下来的部分将讨论在Model Advisor中找到的定点相关检查和子检查。这些部分解释检查,讨论它们在定点代码生成中的重要性,并提供调整模型以优化生成代码的建议。

识别生成昂贵的定点和饱和代码的块

识别有问题的定点操作的Sum块

  • 总和块超出输出范围,出现范围错误。通过在应用程序之前和/或之后插入数据类型转换块,可以获得应用程序所需的任何加法或减法总和

  • 总和块的输入的斜率调整因子不等于输出的斜率调整因子,不匹配需要总和块,以便在每次将输入转换为数据类型并缩放输出时执行乘法运算。不匹配可以通过改变输出或输入的比例来消除。

  • 总和块输入偏差不等于输出偏差,生成的代码包括一条额外的加法或减法指令,以正确说明净偏差调整。改变输出标度的偏差可以使净偏差调整为零,并消除额外操作的需要。

确定有问题的定点操作的最小-最大块

  • 当输入和输出极大极小块具有不同的数据类型,每次执行块时都需要转换操作。使用相同的数据类型时,模型的效率更高。

  • 当输入的数据类型和比例极大极小块与输出的数据类型和缩放不匹配,在执行关系操作之前需要进行转换。这可能会导致铸造时出现范围错误,或者每次执行转换时都会导致精度损失。更改输入或输出的缩放比例以生成更高效的代码。

  • 极大极小块的斜率调整因子与输出的斜率调整因子不同极大极小块需要在每次执行块时执行乘法操作,以将输入转换为数据类型并缩放输出。您可以通过更改输入或输出的缩放来纠正不匹配。

识别可疑定点操作的离散积分器块

  • 当初始条件为离散时间积分器块用于初始化状态和输出,输出方程生成过多的代码,需要额外的全局变量。建议您设置功能块参数>初始条件设置参数到状态(最有效)

识别有问题的定点操作的比较常量块

  • 的输入数据类型与零相比块不能准确地表示零,将输入信号与最接近的可表示值零进行比较,导致参数溢出。要避免此参数溢出,请选择可以表示零的输入数据类型。

  • 如果定值参数与常数相比超出了输入数据类型可以表示的范围,则将输入信号与常数最接近的可表示值进行比较。这会导致参数溢出。若要避免此参数溢出,请选择可以表示该值的输入数据类型定值,或更改定值输入数据类型可以容纳的值。

为可疑的定点操作识别查找表块

与查找表数据相关的效率权衡如中所述间距对速度、错误和内存使用的影响. 基于这些权衡,Model Advisor确定了有可能提高效率的区块,例如:

  • 查找表输入数据的间隔不均匀。

  • 查找表输入数据量化时均匀分布,但非常接近均匀分布。

  • 查询表输入数据是均匀间隔的,但间距不是2的幂。

有关查找表优化的更多信息,请参见查找表优化

检查优化和硬件实现设置

  • 整数除法生成的代码包含针对算术异常的保护,例如,除法为零、INT_MIN/-1和LONG_MIN/-1。如果您构建的模型使异常触发输入组合无法达到除法运算,则作为除法运算一部分生成的保护代码是多余的。

  • 索引搜索法等间隔点需要除法运算,这可能在计算上很昂贵。

确定将调用净斜率计算的块

当定点斜率的变化不是二的幂时,需要计算净斜率。通常,净斜率计算使用整数乘法和移位来实现。在某些情况下,替代实现只需要整数除以常数。其中一个条件是,净斜率可以非常精确地表示为整数的倒数。当满足此条件时,除法实现产生更精确的数值行为。根据编译器和嵌入式硬件的不同,除法实现可能比乘法和移位实现更理想。生成的代码在ROM大小或模型执行大小方面可能更有效。

Model Advisor会在以下情况提醒您:

  • 你设定了用除法进行定点网斜率计算优化参数“开”,但您的型号配置与此选择不兼容。

  • 您的模型配置适合使用除法处理净斜率计算,但您没有设置用除法进行定点网斜率计算优化参数“开”

有关详细信息,请参阅净坡度计算

识别效率较低的产品块

块执行的乘法和除法的数量对准确性和效率有很大的影响。Model Advisor检测到一些(但不是全部)情况,在这些情况下,重新安排操作可以提高准确性、效率或两者兼有。

其中一种情况是计算使用多个除法运算的计算。数值分析领域的一般准则是首先将所有分母项相乘,然后进行一次除法。这提高了浮点运算,尤其是定点运算的精度和速度。这可以在Simulink中通过级联实现万博1manbetx产品块。请注意,模型顾问不会检测到分布在一系列块上的多个分区。

另一种情况是,将单个乘积块配置为执行多个乘法或除法运算。这是受支持的,但如果输出数据类型为整数或定点,则如果将此操作拆分为多个块,每个块执行一次乘法或一次除法,则可能会获得更好的结果。使用多个块允许用户控制用于中间计算的数据类型和比例。中间计算数据类型的选择万博1manbetx会影响精度、范围误差和效率。

检查昂贵的饱和码

设置整数溢出饱和参数可以生成应用程序可能不需要的条件检查代码。

检查应用程序是否需要设置块参数>信号属性>整数溢出饱和. 否则,清除此参数以在生成的代码中最有效地实现该块。

识别可疑的定点操作

此检查识别生成多字运算、繁琐的乘法和除法运算、昂贵的转换代码、查找表块效率低下和昂贵的比较代码的块。

检查多字操作

当操作导致数据类型大于处理器的最大字大小时,生成的代码包含多字操作。多字操作在硬件上可能效率低下。要防止多字操作,请调整操作输入的字长,使其不超过处理器的最大字长。有关在生成的代码中控制多字操作的详细信息,请参阅生成代码中的定点多字操作

检查昂贵的乘法代码

  • 针对嵌入式处理器讨论嵌入式处理器的功能和限制。设计规则建议乘法运算的输入的字长不应大于处理器的基本整数类型。软件中总是可以处理较大单词长度的乘法,但这种方法需要更多的代码,速度也慢得多。Model Advisor识别需要不需要的软件复制的块。可视化地检查生成的代码,包括生成的乘法实用函数,将使这些操作的成本变得清晰。强烈建议您调整模型以避免这些操作。

  • 算术运算规则讨论定点乘法和除法的实现细节。当具有非零偏差的信号涉及乘法和除法时,复杂性显著增加。强烈建议您进行更改,以消除对这些复杂操作的需要。需要额外的步骤来实现乘法。插入数据类型转换在执行乘法的块之前和之后的块允许消除偏差,并允许用户控制中间计算的数据类型和缩放数据类型转换块可以移动到(子)系统的“边缘”。转换只完成一次,所有块都可以从更简单的无偏置数学中受益。

检查昂贵的分区代码

C语言标准未完全指定有符号整数除法的舍入行为。因此,除法生成的代码太大,无法在模拟和代码生成之间提供位真一致性。为避免整数除法生成的代码太大,请在“配置参数”对话框中的硬件实现窗格中,设置有符号整数除法舍入到参数设置为建议值。

识别断点间距不均匀的查找块

与查找表数据相关的效率权衡如中所述间距对速度、错误和内存使用的影响. 基于这些权衡,Model Advisor可识别出有可能提高效率的区块,并在以下情况下发出警告:

  • 查找表输入数据的间隔不均匀。

  • 查找表输入数据量化时均匀分布,但非常接近均匀分布。

  • 查询表输入数据是均匀间隔的,但间距不是2的幂。

检查昂贵的预查找分区

对于一个Prelookup一天的查找表索引搜索方法等间距点.断点数据不具有2倍间距的幂。

如果断点数据不可用,建议将数据调整为偶数,2倍间距。否则,请在“块参数”对话框中指定其他参数索引搜索方法避免计算密集的除法运算。

检查开销大的数据类型转换

当一个块被配置为会为数据类型转换生成低效的代码时,模型顾问会生成一个警告,并就如何使模型更高效提出建议。

检查与预定结果的定点比较

当您选择isInf,isNaN测试数值是否为有限数作为关系运算符块,块切换到一个输入模式。在此模式下,如果输入数据类型为定点、布尔值或内置整数,则输出为FALSEisInfisNaN,适用于测试数值是否为有限数.这可能会导致死代码,而死代码将被万博1manbetxSimulink编码器™

检查昂贵的二进制比较操作

  • 当输入的数据类型为关系运算符块不相同,则每次执行块时都需要一个转换操作。如果其中一个输入是不变的,那么更改数据类型并将不变输入缩放以匹配另一个输入可以提高模型的效率。

  • 关系运算符块具有不同的范围,铸造时会出现范围错误,每次执行转换时都会出现精度损失。您可以插入数据类型转换前面的街区关系运算符块将两个输入转换为具有足够范围和精度来表示每个输入的公共数据类型。

  • 关系运算符块体具有不同的坡度调整系数关系运算符块每次将具有较小正范围的输入转换为具有较大正范围的输入的数据类型和比例时,都需要执行乘法运算。额外的乘法需要额外的代码,降低执行速度,通常会导致额外的精度损失。通过调整输入的比例s、 可以消除不匹配的坡度。

检查昂贵的比较代码

当您的模型配置为生成的代码包含昂贵的比较代码时,model Advisor将生成警告。

在生成的代码中检查昂贵的定点数据类型

当设计包含目标硬件上不存在的整数或定点字长时,生成的代码可能包含额外的饱和代码、移位和多字操作。通过将数据类型更改为目标硬件支持的数据类型,可以提高生成代码的效率。ModelAdvisor会在模型中标记这些昂贵的数据类型。例如,如果目标硬件为32位,Model Advisor将用17字长度标记定点数据类型。万博1manbetx

识别生成昂贵舍入代码的块

当舍入优化可用时,此检查会提醒您。要检查生成昂贵舍入代码的块,Model Advisor将执行以下子检查:

  • 检查乘法和除法中昂贵的舍入操作

  • 检查优化和硬件实现设置(查找块)

  • 检查数据类型转换中是否存在昂贵的舍入

  • 检查模型中是否存在昂贵的舍入模式

传统的手写代码,尤其是用于控制应用程序的代码,几乎总是使用“不费吹灰之力”舍入。例如,对于无符号整数和2的补码有符号整数,右移和舍入位相当于舍入到下限。要获得与传统手写代码相当或更好的结果,请使用最简单的舍入模式。通常,最简单的模式提供最低成本的解决方案没有溢出。如果最简单的模式不可用,请转到地板。

此规则的主要例外是有符号整数除法的舍入行为。C标准未指定这种舍入行为,但对于大多数生产目标,“不努力”模式是舍入为零。对于无符号除法,一切都是非负的,所以四舍五入到下限和四舍五入到零是相同的。要提高舍入效率,请设置模型配置参数>硬件实现>设备详细信息>有符号整数除法舍入到使用您的生产目标使用的模式。

使用整数舍入模式参数,以模拟用于编译从模型生成的代码的C编译器的舍入行为。此设置显示在屏幕上信号属性可以执行有符号整数算术的块的参数对话框窗格,例如产品块要获得最高效的生成代码,请更改整数舍入模式将块的参数设置为建议的设置。

有关选择舍入模式时要考虑的属性的更多信息,请参见选择舍入法