文档

使用memcpy优化矢量赋值生成代码的函数

你可以使用使用memcpy进行向量赋值参数,通过替换来优化生成的向量赋值代码循环与memcpy函数调用。的memcpy功能比功能更有效率-loop控制的元素赋值为大数据集。这种优化提高了执行速度。

选择使用memcpy进行向量赋值参数启用关联参数Memcpy阈值(字节),它允许您指定以字节为单位的最小数组大小memcpy函数调用应该替换生成的代码中的循环。有关更多信息,请参见使用memcpy进行向量赋值(金宝app仿真软件编码器)和Memcpy阈值(字节)(金宝app仿真软件编码器)。在考虑是否使用此优化时,

  • 验证您的目标是否支持金宝appmemcpy函数。

  • 确定您的模型是否使用信号向量分配(例如Y =表达式)来移动大量数据,例如,使用Selector块。

要应用这种优化,

  1. 首先考虑在没有进行优化的情况下生成代码,并测量其执行速度,以建立评估优化分配的基线。

  2. 选择使用memcpy进行向量赋值并检查设置Memcpy阈值(字节),默认情况下指定最小数组大小为64字节memcpy函数调用替换循环。根据应用程序的信号向量赋值中使用的数组大小,以及可能影响阈值选择的目标环境考虑因素,接受默认值或指定另一个数组大小。

  3. 生成代码,并根据您的基线或以前的迭代来度量它的执行速度。重复步骤2和步骤3,直到获得最佳结果。

请注意

memcpy在某些条件下可能不会发生优化,包括其他优化的优先级高于memcpy优化,或者生成的代码来自目标语言编译器(TLC)代码,例如与s -函数块关联的TLC文件。

请注意

如果您是嵌入式编码器许可®,您可以使用代码替换库(CRL)来提供您自己的自定义实现memcpy函数在生成的模型代码中使用。有关更多信息,请参见内存功能码替换

示例模型

检查使用的结果使用memcpy进行向量赋值参数上生成的向量分配代码,创建一个生成信号向量分配的模型。例如,

  1. 使用,选择器块创建以下模型。

  2. 打开模型资源管理器并配置信号的属性三机一体In2源块。对于每一个,港维[1100],并设置数据类型int32.应用更改并保存模型。在本例中,模型有名称vectorassign

  3. 对于每个Selector块,设置指数参数1:50.设置输入口大小参数One hundred.

生成代码

  1. 使用memcpy进行向量赋值参数默认为开启。若要关闭该参数,请进入优化窗格和清除使用memcpy进行向量赋值参数。

  2. 代码生成>报告窗格,并选择创建代码生成报告.然后去代码生成窗格中,选择只生成代码选项,并为模型生成代码。当代码生成完成时,将显示HTML代码生成报告。

  3. 在HTML代码生成报告中,单击vectorassign.c对模型的阶跃函数进行分段检查。注意,向量赋值是使用循环。

    /*模型步进函数*/ void vectorassign_step(void) {int32_T i;For (i = 0;我< 50;i++) {/* Outport: '/Out1'合并:* import: '/In1' */ vectorassign_Y. txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt . txt。着干活[我]= vectorassign_U.In1[我];/* Outport: '/Out2'合并:* import: '/In2' */ vectorassign_Y。Out2[我]= vectorassign_U.In2[我];}}

优化生成代码

  1. 优化窗格,并选择使用memcpy进行向量赋值选择。离开Memcpy阈值(字节)选项的默认设置为64.应用更改并为模型重新生成代码。当代码生成完成时,再次显示HTML代码生成报告。

  2. 在HTML代码生成报告中,单击vectorassign.c节并检查模型输出函数。注意,vector赋值现在是使用memcpy函数调用。

    /* Model step function */ void vectorassign_step(void) {/* Outport: '/Out1'合并:* import: '/In1' */ memcpy(&vectorassign_Y. class . class);着干活[0],&vectorassign_U。三机一体[0], 50U * sizeof(real_T)); /* Outport: '/Out2' incorporates: * Inport: '/In2' */ memcpy(&vectorassign_Y.Out2[0], &vectorassign_U.In2[0], 50U * sizeof(real_T)); }

另请参阅

相关的话题