主要内容

MATLAB编码器生成代码中的优化

为了提高所生成代码的执行速度和内存使用率,MATLAB®编码器™介绍以下优化:

常数合并

在可能的情况下,代码生成器计算MATLAB代码中只涉及编译时常数的表达式。在生成的代码中,它用求值的结果替换这些表达式。这种行为被称为常数折叠。由于常量折叠,生成的代码在执行期间不必计算常量。

下面的示例展示了在代码生成过程中不断折叠的MATLAB代码。这个函数MultiplyConstant将矩阵中的每个元素乘以一个标量常数。该函数使用三个编译时常数的乘积求值,一个b,c

函数= MultiplyConstant(中)% # codegen一个=π^ 4;b = 1 /阶乘(4);c = exp (1);出=。* (a * b * c);结束

代码生成器计算包含编译时常量的表达式,一个b,c.它用生成代码中的求值结果替换这些表达式。

当表达式只涉及标量时,可以发生常数折叠。要在其他情况下显式强制表达式的常量折叠,请使用coder.const函数。有关更多信息,请参见将函数调用折叠为常量

控制恒定折叠

您可以从命令行或项目设置对话框中控制可恒定折叠的指令的最大数量。

  • 在命令行上,为代码生成创建一个配置对象。设置属性ConstantFoldingTimeout到你想要的值。

    cfg = coder.config (“自由”);cfg。ConstantFoldingTimeout = 200;
  • 使用该应用程序,在项目设置对话框中,在所有设置选项卡,设置该字段固定折叠超时时间到你想要的值。

循环融合

在可能的情况下,代码生成器将具有相同运行次数的连续循环融合为生成代码中的单个循环。这种优化减少了循环开销。

下面的代码包含连续的循环,这些循环在代码生成期间被融合。这个函数SumAndProduct计算数组中元素的和和积加勒比海盗.该函数使用两个单独的循环来计算和y_f_sum和产品y_f_prod

函数[y_f_sum,y_f_prod] = SumAndProduct(Arr)% # codegenY_f_sum = 0;Y_f_prod = 1;1:长度(Arr) y_f_sum = y_f_sum+Arr(i);结束i = 1:length(Arr) y_f_prod = y_f_prod*Arr(i);结束

由此MATLAB代码生成的代码在单个循环中计算和和和。

连续矩阵运算组合

在可能的情况下,代码生成器将MATLAB代码中的连续矩阵操作转换为生成代码中的单个循环操作。这种优化减少了在单独的循环中执行矩阵操作所涉及的额外循环开销。

下面的示例包含发生连续矩阵操作的代码。这个函数摆弄矩阵将矩阵的每个元素相乘与一个因素.然后,该函数向结果中的每个元素添加转变

函数Res =摆弄矩阵(垫,因素,转变)Res =垫*因素;Res = Res +转变;结束

生成的代码将乘法和加法组合到一个循环操作中。

不可达代码消除

在可能的情况下,代码生成器会抑制MATLAB代码中不可达过程的代码生成。例如,如果一个分支If, elseif, else语句不可达,则不会为该分支生成代码。

下面的示例包含不可访问的代码,在代码生成过程中会消除这些代码。这个函数SaturateValue根据其输入范围返回一个值x

函数y_b =饱和值(x)% # codegen如果X >0 y_b = X;elseifx > 10%这是多余的Y_b = 10;其他的Y_b = -x;结束

第二分支如果elseif其他的语句不可访问。如果变量x大于10,也大于0。因此,第一个分支优先于第二个分支执行。

MATLAB编码器不为不可达的第二个分支生成代码。

memcpy调用

若要优化复制连续数组元素的生成代码,代码生成器会尝试将代码替换为memcpy调用。一个memcpy调用可能比代码更有效,例如-循环或多个连续的元素赋值。

看到memcpy优化

memset调用

为优化将文字常量赋值给连续数组元素的生成代码,代码生成器会尝试将代码替换为memset调用。一个memset调用可能比代码更有效,例如-循环或多个连续的元素赋值。

看到memset优化