主要内容

使用Model Advisor优化生成的代码

你可以使用Simulink金宝app®Model Advisor帮助您配置定点模型,以实现更有效的设计和优化生成的代码。使用模型顾问检查你的定点模型:

  1. 建模在要分析的模型的页签下,单击模型的顾问

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

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

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

    为了从Model Advisor中启用与所选节点关联的所有Model Advisor检查编辑菜单中,选择选择所有

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

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

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

为可疑的定点操作识别Sum块

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

  • 当一个总和块有一个斜坡调节因子的输入不等于输出的斜坡调节因子,不匹配要求总和块,以便在每次输入转换为输出的数据类型和缩放时执行乘法操作。不匹配可以通过改变输出或输入的比例来消除。

  • 当的净和总和块输入偏差不等于输出偏差,生成的代码包括一个额外的加减法指令,以正确地说明净偏差调整。改变输出缩放的偏置可以使净偏置调整为零,从而消除了额外操作的需要。

为可疑的定点操作识别最小最大块

  • 当输入输出的时候极大极小块具有不同的数据类型,每次执行块时都需要进行转换操作。对于相同的数据类型,该模型更有效。

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

  • 时的输入极大极小块有不同的坡度调整系数比输出,该极大极小Block每次执行块时都需要进行乘法操作,以将输入转换为数据类型并缩放输出。您可以通过改变输入或输出的比例来纠正不匹配。

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

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

识别Compare to Constant块,用于可疑的定点操作

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

  • 如果恒定值参数。与常量比较在输入数据类型可以表示的范围之外,则将输入信号与常数的最接近的可表示值进行比较。这将导致参数溢出。为避免此参数溢出,请选择可以表示恒定值,或更改恒定值到输入数据类型可以容纳的值。

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

中描述了与查找表数据相关的效率权衡间距对速度、错误和内存使用的影响.在这些权衡的基础上,模型顾问确定了有可能提高效率的块,例如:

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

  • 查找表输入的数据是量子化时是等距的,但它非常接近等距。

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

有关查找表优化的详细信息,请参见查找表优化

检查优化和硬件实现设置

  • 整数除法生成的代码包含对除零、INT_MIN/-1和LONG_MIN/-1等算术异常的保护。如果您构造的模型使得异常触发的输入组合不可能达到除法操作,那么作为除法操作的一部分生成的保护代码就是多余的。

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

识别将调用净斜率计算的块

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

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

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

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

有关更多信息,请参见净斜率计算

识别效率较低的产品块

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

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

另一种情况是将单个Product块配置为执行多个乘法或除法操作。这是受支持的,但金宝app是如果输出数据类型是整数或固定的,那么如果将该操作分成几个块,每个块执行一次乘法或除法,结果可能会更好。使用多个块允许用户控制用于中间计算的数据类型和缩放。中间计算的数据类型的选择影响精度、距离误差和效率。

检查昂贵的饱和代码

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

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

识别可疑的定点操作

这种检查可以识别生成多字操作、繁琐的乘除操作、昂贵的转换代码、查找表块的低效率以及昂贵的比较代码的块。

检查多字操作

当一个操作产生的数据类型大于处理器的最大字长时,生成的代码包含多字操作。多字操作在硬件上效率很低。为防止多字操作,请调整操作输入的字长,使它们不超过处理器的最大字长。有关在生成的代码中控制多字操作的详细信息,请参见生成代码中的定点多字操作

检查昂贵的乘法码

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

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

检查昂贵的除法代码

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

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

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

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

  • 查找表输入的数据是量子化时是等距的,但它非常接近等距。

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

检查昂贵的预查找除法

对于一个Prelookupn-D查找表块,索引检索法等距点.断点数据没有2次幂的间距。

如果断点数据不可调,建议将数据调整为均匀的2次幂间距。否则,在块参数对话框中,指定一个不同的索引检索法避免计算量大的除法运算。

检查昂贵的数据类型转换

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

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

当你选择isInfisNaN,或isFinite作为操作的关系操作符块,块切换到单输入模式。在此模式下,如果输入数据类型为定点、布尔或内置整数,则输出为FALSEisInf而且isNaN,为真isFinite.这可能会导致死代码被删除金宝app仿真软件编码器™

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

  • 当输入的数据类型为a关系操作符块不一样,每次执行块都需要转换操作。如果其中一个输入是不变的,那么改变数据类型和缩放不变输入以匹配其他输入将提高模型的效率。

  • 当a的输入关系操作符块有不同的范围,铸造时会有一个范围误差,每次执行转换都会有一个精度损失。你可以插入数据类型转换块之前的关系操作符块,将两个输入转换为具有足够范围和精度来表示每个输入的公共数据类型。

  • 当a的输入关系操作符块体有不同的坡度调节因子,使之关系操作符每次将具有较小正范围的输入转换为具有较大正范围的输入的数据类型和缩放时,Block都需要执行乘法操作。额外的乘法运算需要额外的代码,降低了执行速度,通常还会带来额外的精度损失。通过调整输入的比例,可以消除不匹配的斜率。

检查昂贵的比较代码

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

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

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

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

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

  • 检查乘法和除法中昂贵的舍入运算

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

  • 检查数据类型转换中代价高昂的舍入

  • 检查模型中昂贵的舍入模式

传统的手写代码,特别是控制应用程序,几乎总是使用“轻松”舍入。例如,对于无符号整数和2的补号整数,向右移动并删除位相当于舍入到底数。要获得与传统手写代码相当或更好的结果,请使用最简单的舍入模式。一般来说,最简单的模式提供了成本最小且没有溢出的解决方案。如果最简单的模式不可用,转到地板。

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

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

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