主要内容

马铃薯草编码器生成代码中的优化

提高生成代码的执行速度和内存使用情况,马铃薯草®编码器™介绍以下优化:

恒定折叠

如果可能的话,代码生成器会对只涉及编译时常量的MATLAB代码中的表达式进行计算。在生成的代码中,它将这些表达式替换为计算的结果。这种行为被称为常数折叠。由于经常折叠,生成的代码不必在执行期间计算常量。

下面的例子展示了在代码生成期间经常折叠的MATLAB代码。功能多重奏分子将矩阵中的每个元素乘以一个标量常数。该函数使用三个编译时常量的乘积来计算该常量,一种B.,C

函数= MultiplyConstant(中)%#codegen.a = pi ^ 4;B = 1 /因子(4);c = exp(-1);出局=。*(a * b * c);结尾

代码生成器评估涉及编译时间常量的表达式,一种B.,C.它用生成代码中的求值结果替换这些表达式。

当表达式仅涉及标量时,可能会发生常量折叠。要在其他情况下显式执行常量折叠表达式,请使用coder.const功能。有关更多信息,请参阅将函数调用折叠到常量中

控制常量折叠

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

  • 在命令行中,创建一个用于代码生成的配置对象。设置属性constantfoldingtimeout.到你想要的价值。

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

循环融合

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

以下代码包含连续循环,在代码生成期间融合。功能SumandProduct.评估数组中元素的总和和乘积arr..该功能使用两个单独的循环来评估总和y_f_sum.和产品y_f_prod.

函数[y_f_sum,y_f_prod] = sumandproduct(arr)%#codegen.y_f_sum = 0;y_f_prod = 1;为了i = 1:length(Arr) y_f_sum = y_f_sum+Arr(i);结尾为了i = 1:长度(arr)y_f_prod = y_f_prod * arr(i);结尾

从该MATLAB代码生成的代码在单循环中评估总和和产品。

逐次矩阵运算组合

当可能时,代码生成器将在MATLAB代码中的连续矩阵操作转换为生成代码中的单循环操作。这种优化减少了在单独的循环中执行矩阵操作的过度循环开销。

以下示例包含发生连续矩阵操作的代码。功能Manipulatematrix.乘以矩阵的每个元素与A.因素.对于结果中的每个元素,该功能然后添加一个转移

函数res = manipulatematrix(垫,因子,shift)Res = mat *因子;res = res + shift;结尾

生成的代码将乘法组合成单循环操作。

无法访问的代码消除

当可能时,代码生成器会抑制来自MATLAB代码中的无法访问的过程的代码。例如,如果一个分支如果,elsefif,else语句无法访问,然后不会为该分支生成代码。

以下示例包含无法访问的代码,在代码生成期间被消除。功能SaturateValue根据其输入的范围返回值X

函数y_b = sermatatevalue(x)%#codegen.如果x> 0 y_b = x;elsef.x> 10%这是冗余的y_b = 10;别的y_b = -x;结尾

第二个分支如果elsef.别的声明无法访问。如果是变量X大于10,它也大于0.因此,优选第二分支执行第一分支。

Matlab编码器不会为无法访问的第二分支生成代码。

memcpy.呼叫

要优化复制连续数组元素的生成的代码,代码生成器尝试使用a替换代码memcpy.称呼。一种memcpy.呼叫可以比代码更有效,例如a为了-loop或多个,连续的元素分配。

Memcpy优化

memset呼叫

为了优化为连续数组元素分配文字常数的生成的代码,代码生成器试图用一个替换代码memset称呼。一种memset呼叫可以比代码更有效,例如a为了-loop或多个,连续的元素分配。

Memset优化