主要内容

优化动态数组访问

通过使用configuration属性,可以使代码中的动态数组运行得更快CacheDynamicArrayDataPointer.此属性将数据指针提升到一个临时变量。在动态数组的情况下,这个临时变量用于访问矩阵数据。

缺省情况下,该属性为MEX、静态库、动态链接库和可执行配置启用。缓存动态数组数据指针可以使动态数组的执行时间几乎等于静态数组的执行时间。在许多情况下,此属性还有助于提高代码的可读性。

禁用缓存动态数组数据指针属性

方法禁用属性MATLAB®编码器™应用:

  1. 打开生成对话框。在生成代码页,单击生成箭头

  2. 点击更多的设置

  3. 先进的选项卡,设置缓存动态数组数据没有

在命令行中禁用该属性。

  1. 在MATLAB工作空间中,定义配置对象,使用coder.config使用参数墨西哥人的“自由”“dll”,或exe”(取决于您的要求)。

    CFG = code .config(“自由”);
  2. 设置CacheDynamicArrayDataPointer属性

    cfg。CacheDynamicArrayDataPointer = false;

比较生成的C代码

将生成的C代码与启用的缓存动态数组数据指针和禁用的缓存动态数组数据指针进行比较。

考虑一个函数matrixAdd

函数c = matrixAdd(a,b)% # codegenC = a+b;结束

属性定义配置对象并生成C代码codegen命令。

  1. 生成C代码时启用缓存动态数组数据指针:

    CFG = code .config(“自由”);codegen配置cfgmatrixAddarg游戏...{编码器。typeof(0, [1 Inf]),编码器。typeof(0, [1 Inf])}报告
    代码生成成功:查看报告
  2. 生成C代码时禁用缓存动态数组数据指针:

    CFG = code .config(“自由”);cfg。CacheDynamicArrayDataPointer = false;codegen配置cfgmatrixAddarg游戏...{编码器。typeof(0, [1 Inf]),编码器。typeof(0, [1 Inf])}报告
    代码生成成功:查看报告

打开报告并检查生成的代码。

该表比较了生成的C代码。当启用该属性时,临时变量如* a_data* b_data,* c_data包含在生成的代码中。临时变量的使用消除了访问矩阵数据时对双指针解引用的需要。从而提高了生成的C代码中动态数组的执行时间。

启用缓存动态数组数据指针 缓存动态数组数据指针禁用
(const emxArray_real_T *a,…const emxArray_real_T *b, emxArray_real_T *c) {double *a_data;双* b_data;双* c_data;int我;B_data = b->data;A_data = a->data;If (a->size[1] == b->size[1]) {int loop_ub;I = c->size[0] * c->size[1];C ->大小[0]= 1; c->size[1] = a->size[1]; emxEnsureCapacity_real_T(c, i); c_data = c->data; loop_ub = a->size[1]; for (i = 0; i < loop_ub; i++) { c_data[i] = a_data[i] + b_data[i]; } } else { plus(c, a, b); } }
(const emxArray_real_T *a,…const emxArray_real_T *b, emxArray_real_T *c) {int i;If (a->size[1] == b->size[1]) {int loop_ub;I = c->size[0] * c->size[1];C ->大小[0]= 1;C ->size[1] = a->size[1];emxEnsureCapacity_real_T (c i);Loop_ub = a->size[1];For (i = 0;I < loop_ub; i++) { c->data[i] = a->data[i] + b->data[i]; } } else { plus(c, a, b); } }

限制

缓存动态数组数据指针不支持:金宝app

  • c++编码器:数组

  • GPU编码器

  • 带有数据对齐规范的代码替换库

另请参阅

|

相关的话题