最大限度地减少块输出中间结果的计算和存储

最大限度地减少块输出中间结果的计算和存储

Expression Folding

表达式折叠

表达式折叠优化代码,以最小化块输出处中间结果的计算,并将这些结果存储在临时缓冲区或变量中。启用“表达式折叠”时,代码生成器将块计算折叠(折叠)为单个表达式,而不是为模型中的每个块生成单独的代码语句和存储声明。大多数Simulink块支持表达式折叠。

表达式折叠提高了生成代码的效率,经常获得比手工优化代码更好的结果。在许多情况下,整个模型计算组被折叠成一行高度优化的代码。

可以在自己的内联S函数块中使用表达式折叠。有关详细信息,请参见支持表达式折叠的S函数。

Example Model

 

Generate Code

关闭expression folding后,在explfld.c文件中,代码生成器生成此代码。

/* Model step function */

void exprfld_step(void)

{

  /* Gain: '<Root>/Gain' incorporates:

   *  Inport: '<Root>/In1'

   */

  exprfld_B.S1 = exprfld_P.Gain_Gain * exprfld_U.i1;

 

  /* Gain: '<Root>/Gain1' incorporates:

   *  Inport: '<Root>/In2'

   */

  exprfld_B.S2 = exprfld_P.Gain1_Gain * exprfld_U.i2;

 

  /* Outport: '<Root>/Out1' incorporates:

   *  Product: '<Root>/Product'

   */

  exprfld_Y.Out1 = exprfld_B.S1 * exprfld_B.S2;

}

两个增益块都有单独的代码语句。在最终输出之前,这些代码语句计算增益块的临时结果。

 

启用优化

默认情况下,“表达式折叠”(Expression folding)处于启用状态。要查看现有模型是否启用了表达式折叠,请执行以下操作:

1.表达式折叠仅在选择配置参数>信号存储重用参数时可用,因为表达式折叠仅对涉及局部变量的表达式进行操作。启用信号存储重用参数。

2.选择“信号存储重用”时,“启用本地块输出”、“重用本地块输出”和“消除多余的局部变量(表达式折叠)”参数默认都处于启用状态。

优化生成代码

使用表达式折叠,代码生成器生成单行输出计算,如expfld.c文件所示。生成的注释记录了表达式中出现的块参数。

/* Model step function */

void exprfld_step(void)

{

  /* Outport: '<Root>/Out1' incorporates:

   *  Gain: '<Root>/Gain'

   *  Gain: '<Root>/Gain1'

   *  Inport: '<Root>/In1'

   *  Inport: '<Root>/In2'

   *  Product: '<Root>/Product'

   */

  exprfld_Y.Out1 =

     exprfld_P.Gain_Gain *

     exprfld_U.i1 *

     (exprfld_P.Gain1_Gain * exprfld_U.i2);

}

更复杂模型上下文中的表达式折叠示例,请单击rtwdemo_slexprfold,或在命令提示下键入:

rtwdemo_slexprfold

人工智能芯片与自动驾驶
原文地址:https://www.cnblogs.com/wujianming-110117/p/14306071.html