主要内容

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

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

恒定折叠

当可能时,代码生成器会评估MATLAB代码中的表达式,该代码仅涉及编译时间常量。在生成的代码中,它将这些表达式替换为评估结果。这种行为称为常量折叠。由于持续折叠,所生成的代码不必在执行期间评估常量。

以下示例显示了代码生成期间常用的MATLAB代码。功能多次间隔通过标量常数将每个元素乘以矩阵中的每个元素。该函数使用三个编译时间常量的乘积来评估此常数,一种B., 和C

功能OUT = MultiplyConstant(IN)%#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:长度(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(垫,因子,换档)Res = mat *因子;res = res + shift;结尾

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

无法访问的代码消除

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

以下示例包含无法访问的代码,该代码在代码生成期间被消除。功能饱和值基于输入范围返回值X

功能y_b = sermatatevalue(x)%#codegen.如果x> 0 y_b = x;eleesifx> 10%这是冗余的Y_B = 10;别的y_b = -x;结尾

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

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

梅检呼叫

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

MEMCPY优化

Memset.呼叫

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

MEMSET优化