使用 memcpy 进行向量赋值
优化为向量赋值生成的代码
模型配置窗格: 代码生成 / 优化
描述
使用 memcpy 进行向量赋值参数指定是否通过用 memcpy 替换 for 循环来优化为向量赋值生成的代码。
指针赋值可避免代价高昂的数据副本。因此,与 for 循环控制的元素赋值和 memcpy 函数调用相比,指针赋值使用的栈空间更少,执行速度更快。当为向量信号赋大型数据集时,这种优化可显著提高代码效率。
依赖项
当您选择此参数时,关联的参数 Memcpy 阈值(字节) 将启用。
设置
on | off- On
根据关联的阈值参数 Memcpy 阈值(字节) 启用为向量赋值使用
memcpy。如果数组元素的数量乘以每个元素的字节数大于或等于为 Memcpy 阈值(字节) 指定的值,则在生成的代码中使用memcpy。在此上下文中,一个字节等于一个字符的宽度。- Off
禁用为向量赋值使用
memcpy。
示例
此示例说明如何通过将向量信号赋值转换为指针赋值来消除数据副本。
配置模型以优化向量信号赋值的生成代码
要应用此优化,请执行下列操作:
确认您的目标支持
memcpy函数。确定您的模型是否使用向量信号赋值(例如
Y=expression)来移动大量数据。例如,您的模型可能使用 Selector 模块从向量、矩阵或多维信号中选择输入元素。在优化窗格中,使用 memcpy 进行向量赋值(默认开启)会启用关联的 Memcpy 阈值(字节) 参数。
检查 Memcpy 阈值(字节) 的设置。默认情况下,它指定 64 字节作为最小数组大小,只有大于或等于此值时,
memcpy函数调用或指针赋值才可取代生成代码中的for循环。根据您的应用程序向量信号赋值中的数组大小以及目标环境中关于阈值选择的注意事项,接受默认值或指定其他数组大小。
示例模型
打开示例模型 rtwdemo_pointer_conversion。此模型使用 Switch 模块将数据赋给向量信号。然后,此信号馈入 Bus Selector 模块。
model='rtwdemo_pointer_conversion';
open_system(model);

生成代码但不进行优化
在“配置参数”对话框中,清除使用 memcpy 进行向量赋值参数。或者,使用命令行。
set_param(model, 'EnableMemcpy','off');
按 Ctrl+B 生成代码。或者,使用命令行。
slbuild(model);
### Searching for referenced models in model 'rtwdemo_pointer_conversion'. ### Total of 1 models to build. ### Starting build procedure for: rtwdemo_pointer_conversion ### Successful completion of build procedure for: rtwdemo_pointer_conversion Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================================= rtwdemo_pointer_conversion Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 16.894s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 17.85s
查看生成的代码而不进行优化。这是 rtwdemo_pointer_conversion.c 的一部分。
cfile = fullfile('rtwdemo_pointer_conversion_ert_rtw','rtwdemo_pointer_conversion.c'); coder.example.extractLines(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_pointer_conversion_step(void)
{
int32_T i;
int16_T rtb_dataX[100];
int16_T rtb_dataY[100];
/* Switch generated from: '<Root>/Switch' incorporates:
* Constant: '<Root>/Constant'
* Constant: '<Root>/Constant1'
* Constant: '<Root>/Constant2'
* Constant: '<Root>/Constant3'
* Inport: '<Root>/In1'
*/
for (i = 0; i < 100; i++) {
if (rtU.In1) {
rtb_dataX[i] = rtCP_Constant_Value[i];
rtb_dataY[i] = rtCP_Constant1_Value[i];
} else {
rtb_dataX[i] = rtCP_Constant2_Value[i];
rtb_dataY[i] = rtCP_Constant3_Value[i];
}
}
/* End of Switch generated from: '<Root>/Switch' */
/* S-Function (sfix_look1_dyn): '<Root>/Lookup Table Dynamic' incorporates:
* Inport: '<Root>/In2'
* Outport: '<Root>/Out1'
*/
/* Dynamic Look-Up Table Block: '<Root>/Lookup Table Dynamic'
* Input0 Data Type: Integer S16
* Input1 Data Type: Integer S16
* Input2 Data Type: Integer S16
* Output0 Data Type: Integer S16
* Lookup Method: Linear_Endpoint
*
*/
LookUp_S16_S16( &(rtY.Out1), &rtb_dataY[0], rtU.In2, &rtb_dataX[0], 99U);
}
在没有优化的情况下,生成的代码包含 for 循环控制的元素赋值。
启用优化和生成代码
在“配置参数”对话框中,选择使用 memcpy 进行向量赋值参数。
set_param(model, 'EnableMemcpy','on')
生成代码。
slbuild(model);
### Searching for referenced models in model 'rtwdemo_pointer_conversion'. ### Total of 1 models to build. ### Starting build procedure for: rtwdemo_pointer_conversion ### Successful completion of build procedure for: rtwdemo_pointer_conversion Build Summary Top model targets: Model Build Reason Status Build Duration ========================================================================================================= rtwdemo_pointer_conversion Generated code was out of date. Code generated and compiled. 0h 0m 12.816s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 13.942s
查看优化后的生成代码。这是 rtwdemo_pointer_conversion.c 的一部分。
cfile = fullfile('rtwdemo_pointer_conversion_ert_rtw','rtwdemo_pointer_conversion.c'); coder.example.extractLines(cfile,'/* Model step','/* Model initialize',1, 0);
/* Model step function */
void rtwdemo_pointer_conversion_step(void)
{
const int16_T *rtb_dataX_0;
const int16_T *rtb_dataY_0;
/* Inport: '<Root>/In1' */
if (rtU.In1) {
/* Switch generated from: '<Root>/Switch' incorporates:
* Constant: '<Root>/Constant'
*/
rtb_dataX_0 = &rtCP_Constant_Value[0];
/* Switch generated from: '<Root>/Switch' incorporates:
* Constant: '<Root>/Constant1'
*/
rtb_dataY_0 = &rtCP_Constant1_Value[0];
} else {
/* Switch generated from: '<Root>/Switch' incorporates:
* Constant: '<Root>/Constant2'
*/
rtb_dataX_0 = &rtCP_Constant2_Value[0];
/* Switch generated from: '<Root>/Switch' incorporates:
* Constant: '<Root>/Constant3'
*/
rtb_dataY_0 = &rtCP_Constant3_Value[0];
}
/* End of Inport: '<Root>/In1' */
/* S-Function (sfix_look1_dyn): '<Root>/Lookup Table Dynamic' incorporates:
* Inport: '<Root>/In2'
* Outport: '<Root>/Out1'
*/
/* Dynamic Look-Up Table Block: '<Root>/Lookup Table Dynamic'
* Input0 Data Type: Integer S16
* Input1 Data Type: Integer S16
* Input2 Data Type: Integer S16
* Output0 Data Type: Integer S16
* Lookup Method: Linear_Endpoint
*
*/
LookUp_S16_S16( &(rtY.Out1), &rtb_dataY_0[0], rtU.In2, &rtb_dataX_0[0], 99U);
}
由于 Memcpy 阈值(字节) 参数的设置低于生成的代码中的数组大小,因此优化后的代码中包含用于向量信号赋值的指针赋值。
bdclose(model)
提示
如果
memcpy的目标未被更改,代码生成器可以通过用指针赋值替换memcpy函数调用来进一步优化代码。
推荐的设置
| 应用情形 | 设置 |
|---|---|
| 调试 | 无影响 |
| 可追溯性 | 无影响 |
| 效率 | On |
| 安全预警 | 无影响 |
编程用法
参数:EnableMemcpy |
| 类型:字符向量 |
值:'on' | 'off' |
默认值:'on' |
版本历史记录
在 R2008b 中推出
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
选择网站
选择网站以获取翻译的可用内容,以及查看当地活动和优惠。根据您的位置,我们建议您选择:。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)