主要内容

生成启用隐式展开的代码

隐式展开是指自动更改兼容操作数的大小,以应用元素级操作。如果对于每个维度,数组的维度大小相同或其中一个是单例的,则两个维度具有兼容的大小。看到基本操作的兼容数组大小

默认情况下,在生成的代码中启用隐式展开。启用隐式展开生成的代码可能与禁用隐式展开生成的代码在以下方面有所不同:

  • 输出的大小

  • 额外的代码生成

  • 性能的变化

对于可变大小的动态数组,生成的代码显示这些更改以在运行时完成隐式展开。

对于固定大小的数组和常量数组,由于操作数的值和大小在编译时已知,因此为计算隐式扩展输出而生成的代码不需要生成额外的代码,也不会导致性能变化。

若要控制生成代码中的隐式展开,请参见优化生成代码中的隐式展开

输出的大小

隐式展开自动展开操作数以应用按元素的操作。例如,考虑以下大小兼容的输入类型:

A_type =编码器。typeof(1、2 [1]);B_type =编码器。typeof(1, 2正);

启用隐式展开的对这两个操作数的二进制操作将自动展开的第二个维度a_type以得到2 × inf的输出大小。的第二个维度禁用了隐式展开a_type不会自动展开,且输出大小为2 × 1。

对于在生成的代码中禁用隐式展开创建的现有工作流,为相同的MATLAB生成代码®启用隐式展开的代码可能会产生大小不匹配错误或更改二进制操作和函数的输出大小。要排除大小不匹配错误,请参见诊断和修复可变大小的数据错误

额外的代码生成

隐式展开允许在操作数大小兼容的情况下自动展开操作数。要执行此大小更改,生成的代码将引入允许展开操作数的代码。

例如,考虑下面的代码片段。这个函数vector_sum求两个数组的和。

函数= vector_sum(a,b) Out = a + b;结束

考虑定义在这里的可变大小动态数组:

C_type =编码器。typeof([1正]);

vector_sum使用该命令:

codegenvector_sumarg游戏{c_type, c_type}配置:自由报告

为这个函数生成的隐式展开代码:

静态void + (emxArray_real_T *out,…const emxArray_real_T *b, const emxArray_real_T *a) {int i;....如果(a - >大小[1]= = 1){- >大小[1]= b - >大小[1];} else {out->size[1] = a->size[1];}……If (a->size[1] == 1) {loop_ub = b->size[1];} else {loop_ub = a->size[1];} for (i = 0;I < loop_ub; i++) { out->data[i] = b->data[i * stride_0_1] + a->data[i * stride_1_1]; } } void vector_sum(const emxArray_real_T *a, const emxArray_real_T *b, emxArray_real_T *out) { int i; int loop_ub; if (b->size[1] == a->size[1]) { i = out->size[0] * out->size[1]; out->size[0] = 1; out->size[1] = b->size[1]; emxEnsureCapacity_real_T(out, i); loop_ub = b->size[1]; for (i = 0; i < loop_ub; i++) { out->data[i] = b->data[i] + a->data[i]; } } else { plus(out, b, a); } }

为这个函数生成的代码,没有隐式展开:

(const emxArray_real_T *a,…const emxArray_real_T *b, emxArray_real_T *out){int i;int loop_ub;I = out->size[0] * out->size[1];Out ->size[0] = 1;Out ->size[1] = b->size[1];emxEnsureCapacity_real_T(我);Loop_ub = b->size[1];For (i = 0;I < loop_ub; i++) { out->data[i] = b->data[i] + a->data[i]; } }

在本例中,启用隐式展开后,代码生成器将创建支持函数金宝app+,进行尺寸变化并计算输出。

在大多数情况下,执行隐式展开的支持函数金宝app以它所辅助的二进制操作命名。在前面的例子中,如果表达式Out = a + b变为Out = a - b时,支持函数名称变为金宝app-

一些支持函金宝app数也可以命名为expand_人事处,在那里人事处指二进制运算。在前面的例子中,如果表达式Out = a + b替换为Out = max(a,b)时,生成代码中支持函数的名称变为金宝appexpand_max

如果表达式中的多个操作需要隐式展开,则生成的代码将包含一个指定的支持函数金宝appbinary_expand_op.支持函数金宝app改变操作数的大小并应用二进制操作。

如果您想应用特定的二进制操作和函数,而不需要隐式展开,请使用coder.sameSizeBinaryOp.为应用此函数而生成的代码不包括用于展开操作数的其他代码。该函数的输出不展开MATLAB中的操作数。此函数不支持标量展开。金宝app操作数的大小必须相同。

如果您希望在生成的代码中对函数内的所有二进制操作禁用函数内的隐式展开,请调用coder.noImplicitExpansionInFunction在要求的函数中。MATLAB代码中的隐式展开仍然启用。

性能的变化

启用隐式展开时生成的代码的性能可能与禁用隐式展开时不同。根据使用隐式展开的生成代码的输入,代码可能需要更长的时间来计算输出。

如果生成的代码由于隐式展开而不符合工作流的性能要求,那么可以通过关闭特定二进制操作、特定函数体或整个项目的隐式展开来为项目生成代码。看到优化生成代码中的隐式展开

请注意

在禁用隐式展开之前,请确保外部代码不使用隐式展开。如果项目包含来自外部源的MATLAB代码,则禁用整个项目的隐式展开可能会在生成代码时导致错误。

另请参阅

|

相关的话题