通过重新排序生成代码中的块操作来删除数据副本
属性来删除数据副本优化生成代码中的块顺序参数从从
来提高执行速度
.更改此设置指示代码生成器在可能删除数据副本的情况下对块操作重新排序。该参数在“配置参数”对话框中。这种优化节省了RAM和ROM的消耗。
示例模型
在模型中ex_optimizeblockorder
,离开Sum块的信号进入a减去Block和a连接块。信号离开减去块进入一个产品Block和a元素和块。
生成没有优化的代码
图片显示了模型ex_optimizeblockorder
在模型构建之后。红色数字表示生成代码中的默认块顺序。Subtract块在Concatenate块之前执行。Product块在Sum of Elements块之前执行。
查看未经过优化的生成代码。这是ex_optimizeblockorder_step
函数。
/*模型步函数*/ void ex_optimizeblockorder_step(void) {real_T rtb_Sum2x3[6];int32_T我;real_T rtb_Sum2x3_d;real_T rtb_Subtract;/* Sum: '/SumOfElements' */ rtY。Out2 = -0.0;For (i = 0;I < 6;i++) {/* Sum: '<根>/Sum2x3'合并:*输入:'<根>/In1' *输入:'<根>/In2' */ rtb_Sum2x3_d = rtU。In1[i] + rtU.In2;/* Sum: '<根>/减去'合并:*导入:'<根>/In3' */ rtb_Subtract = rtb_Sum2x3_d rtU.In3;/* Outport:“<根>/Out1”包含:* Inport:“<根>/In4”* Product:“<根>/Product”*/ rtY。Out1[i] = rtU。In4[i] * rtb_Subtract; /* Sum: ' /Sum2x3' */ rtb_Sum2x3[i] = rtb_Sum2x3_d; /* Sum: ' /SumOfElements' */ rtY.Out2 += rtb_Subtract; } /* Concatenate: ' /MatrixConcat ' */ for (i = 0; i < 3; i++) { /* Outport: ' /Out3' incorporates: * Inport: ' /In5' */ rtY.Out3[i << 2] = rtb_Sum2x3[i << 1]; rtY.Out3[2 + (i << 2)] = rtU.In5[i << 1]; rtY.Out3[1 + (i << 2)] = rtb_Sum2x3[(i << 1) + 1]; rtY.Out3[3 + (i << 2)] = rtU.In5[(i << 1) + 1]; } /* End of Concatenate: ' /MatrixConcat ' */ }
使用默认顺序,生成的代码包含三个缓冲区,rtb_Sum2x3 [6]
,rtb_Sum2x3_d
,rtb_Subtract
.生成的代码包含这些临时变量和相关的数据副本,因为矩阵连接块的输出必须使用总和Block和元素和块的输出必须使用减去块。
使用优化生成代码
该图像显示了ex_optimizeblockorder
在设置优化生成代码中的块操作顺序参数提高执行速度
建立模型。的减去块在连接块。的产品块在元素和块。
在优化的代码中,三个缓冲区rtb_Sum2x3 [6]
,rtb_Sum2x3_d
,rtb_Subtract
他们的相关数据副本也不见了。生成的代码不需要这些临时变量来保存Sum和Subtract块的输出,因为Subtract块执行在Concatenate块之后,Product块执行在Sum of Elements块之后。
/*模型步长函数*/ void ex_optimizeblockorder_step(void) {int32_T i;/* Sum: '<根>/Sum2x3'合并:* import: '<根>/In1' * import: '<根>/In2' */ for (i = 0;I < 6;i++) {rtY。Out1[i] = rtU。In1[i] + rtU.In2;} /* End of Sum: '/Sum2x3' */ /* Concatenate: ' /MatrixConcat ' */ for (i = 0;I < 3;i++){/*输出端口:'<根>/Out3'合并:*输入端口:'<根>/In5' */ rtY。Out3[i << 2] = rtY。Out1[i << 1];而无。Out3[2 + (i << 2)] = rtU.In5[i << 1]; rtY.Out3[1 + (i << 2)] = rtY.Out1[(i << 1) + 1]; rtY.Out3[3 + (i << 2)] = rtU.In5[(i << 1) + 1]; } /* End of Concatenate: ' /MatrixConcat ' */ /* Sum: ' /SumOfElements' */ rtY.Out2 = -0.0; for (i = 0; i < 6; i++) { /* Sum: ' /Subtract' incorporates: * Inport: ' /In3' */ rtY.Out1[i] -= rtU.In3; /* Sum: ' /SumOfElements' */ rtY.Out2 += rtY.Out1[i]; /* Outport: ' /Out1' incorporates: * Inport: ' /In4' * Product: ' /Product' */ rtY.Out1[i] *= rtU.In4[i]; } }
为了实现缓冲区重用,代码生成器不会违反用户指定的块优先级。