Оптимизируйте неявное расширение в сгенерированном коде

Неявное расширение в сгенерированном коде включено по умолчанию. Генератор кода вводит модификации в сгенерированном коде, чтобы выполнить неявное расширение. Изменения в сгенерированном коде могут привести к дополнительному коду, чтобы расширить операнды. Расширение операндов может влиять на эффективность сгенерированного кода. Смотрите Генерируют Код С Enabled Неявным расширением.

Неявное расширение может изменить размер выходных параметров от поддерживаемых операторов и функций, вызывающих размер и ошибки несоответствия типов в вашем рабочем процессе.

Для мелкомодульного управления того, где неявное расширение включено в сгенерированном коде, используйте следующие функции в своем MATLAB® код:

Например, рассмотрите этот фрагмент кода. Функциональный vector_sum находит сумму двух массивов совместимых размеров.

function out = vector_sum(a,b)
out = b + a;
end

Типы операндов a и b заданы как:

a_type = coder.typeof(1,[2 1])       %size: 2x1
b_type = coder.typeof(1,[2 Inf])     %size: 2x:inf
Без неявного расширенияС неявным расширением

Без неявного расширения, размера out переменная вычисляется как 2x1.

Image of the Code Generation Report while hovering over the plus operation. A dialog box generated from the operation outlines the size, class, and complexity of the operation. The size of the output variable out without implicit expansion is shown as 2 x 1.

С неявным расширением, размером переменной out вычисляется как 2x:?.

Image of the Code Generation Report while hovering over the plus operation. A dialog box generated from the operation outlines the size, class, and complexity. Also mentions that the dimensions shown in bold imply the possible use of implicit expansion. The size of the output variable, out, is shown as 2 x :?.

Эти фрагменты кода обрисовывают в общих чертах изменения в сгенерированном коде для функционального vector_sum, в то время как неявное расширение отключено и включено. Сгенерировать код, типы операндов a и b заданы как:

a_type = coder.typeof(1,[1 Inf])       %size: 1x:inf
b_type = coder.typeof(1,[1 Inf])       %size: 1x:inf
Сгенерированный код с отключенным неявным расширениемСгенерированный код с Enabled неявным расширением
void vector_sum(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(out, i);
  loop_ub = b->size[1];
  for (i = 0; i < loop_ub; i++) {
    out->data[i] = b->data[i] + a->data[i];
  }
}
static void plus(emxArray_real_T *out, const emxArray_real_T *b,
                 const emxArray_real_T *a)
{
  int i;
  ....
  if (a->size[1] == 1) {
    out->size[1] = b->size[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);
  }
}

Отключите неявное расширение в заданной функции при помощи coder.noImplicitExpansionInFunction

Если вы требуете неявного расширения в своем проекте, но не в определенных функциях, отключаете неявное расширение для сгенерированного кода этой функции путем вызова coder.noImplicitExpansionInFunction в функции.

Например, код сгенерирован для vector_sum не применяет неявное расширение.

КОД MATLABСгенерированный код с coder.sameSizeBinaryOp
function out = vector_sum(a,b)
out = coder.sameSizeBinaryOp(@plus, a, b);
end
a = coder.typeof(1,[1 Inf])    %size: 1x:inf
b = coder.typeof(1,[1 Inf])    %size: 1x:inf
codegen vector_sum -launchreport -args {a,b} -config:lib
void vector_sum(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] = a->size[1];
  emxEnsureCapacity_real_T(out, i);
  loop_ub = a->size[1];
  for (i = 0; i < loop_ub; i++) {
    out->data[i] = a->data[i] + b->data[i];
  }
}

Примечание

coder.noImplicitExpansionInFunction не отключает неявное расширение в вашем коде MATLAB. Это отключает неявное расширение только в сгенерированном коде.

Отключите неявное расширение для определенной бинарной операции при помощи coder.sameSizeBinaryOp

Используйте функцию coder.sameSizeBinaryOp выполнять проверку на ошибки, чтобы гарантировать, что операнды одного размера и препятствуют тому, чтобы генератор кода генерировал неявно расширенный код для этой функции.

Например, этот фрагмент кода применяется плюс операция при помощи coder.sameSizeBinaryOp без неявного расширения.

КОД MATLABСгенерированный код
function out = vector_sum(a,b)
coder.noImplicitExpansionInFunction();
out = a + b;
end
a = coder.typeof(1,[1 Inf])    %size: 1x:inf
b = coder.typeof(1,[1 Inf])    %size: 1x:inf
codegen vector_sum -launchreport -args {a,b} -config:lib
void vector_sum(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] = a->size[1];
  emxEnsureCapacity_real_T(out, i);
  loop_ub = a->size[1];
  for (i = 0; i < loop_ub; i++) {
    out->data[i] = a->data[i] + b->data[i];
  }
}

coder.sameSizeBinaryOp не поддерживает скалярное расширение. Операнды даны coder.sameSizeBinaryOp должно быть одного размера.

Отключите Неявное расширение в своем Проекте

Если вы не требуете неявного расширения в своем сгенерированном коде или не хотите, чтобы модификации влияли на ваш сгенерированный код, выключили его путем установки EnableImplicitExpansion отметьте в своем coder.config возразите против false. Этот флаг установлен в true по умолчанию.

Отключите неявное расширение в своем Simulink® модель путем установки параметра всей модели Enable Implicit Expansion in MATLAB blocks на false. В качестве альтернативы используйте эту команду:

set_param(gcm,'EnableImplicitExpansion',false);

Примечание

Перед выключением неявного расширения гарантируйте, что внешний код не использует неявное расширение. Отключение неявного расширения для целого проекта может вызвать ошибки при генерации кода, если проект включает код MATLAB из внешних источников.

Смотрите также

|

Похожие темы