Сгенерируйте код с Enabled неявным расширением

Неявное расширение относится к автоматическому изменению размера совместимых операндов, чтобы применить поэлементные операции. Две размерности имеют совместимые размеры, если для каждой размерности размеры размерности массивов являются или тем же самым или одним из них, одиночный элемент. Смотрите Совместимые Размеры Массивов для Основных Операций.

Неявное расширение в сгенерированном коде включено по умолчанию. Код, сгенерированный с включенным неявным расширением, может отличаться от кода, сгенерированного с неявным расширением, отключенным этими способами:

  • 'OutputSize'

  • Генерация дополнительного кода

  • Изменение эффективности

Для динамических массивов переменного размера сгенерированный код показывает эти изменения, чтобы выполнить неявное расширение во времени выполнения.

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

Чтобы управлять неявным расширением в сгенерированном коде, смотрите, Оптимизируют Неявное расширение в Сгенерированном коде.

'OutputSize'

Неявное расширение автоматически расширяет операнды, чтобы применить поэлементные операции. Например, рассмотрите эти входные типы совместимого размера:

a_type = coder.typeof(1,[2 1]);
b_type = coder.typeof(1,[2 inf]);

Бинарная операция на этих двух операндах с неявным расширением, включенным автоматически, расширяет второе измерение a_type привести к выходному размеру 2 Inf. С отключенным неявным расширением, второе измерение a_type автоматически не расширен, и выходной размер 2 1.

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

Генерация дополнительного кода

Неявное расширение позволяет операндам быть автоматически расширенными, если размеры операнда совместимы. Чтобы выполнить это изменение размера, сгенерированный код вводит код, который позволяет операндам быть расширенными.

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

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

Считайте динамический массив переменного размера заданным здесь:

c_type = coder.typeof(1,[1 Inf]);

Сгенерируйте код для vector_sum при помощи этой команды:

codegen vector_sum -args {c_type, c_type} -config:lib -report

Сгенерированный код для этой функции с и без неявного расширения перечислен в этой таблице.

Сгенерированный код с отключенным неявным расширениемСгенерированный код с 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);
  }
}

С включенным неявным расширением генератор кода создает функцию поддержки в этом случае plus, выполнить изменение размера и вычислить выход.

В большинстве случаев функцию поддержки, выполняющую неявное расширение, называют после бинарной операции это помогает. В предыдущем примере, если выражение out = a + b изменяется на out = a - b, имя поддержки функционирует изменения в minus.

Некоторые поддерживающие функции можно также назвать как expand_op, где op относится к бинарной операции. В предыдущем примере, если выражение out = a + b заменяется out = max(a,b), имя поддержки функционирует в изменениях сгенерированного кода в expand_max.

Если несколько операций в выражении требуют неявного расширения, сгенерированный код включает функцию поддержки, которую называют binary_expand_op. Функции поддержки изменяют размер операнда и применяют бинарные операции.

Если вы хотите применить определенные бинарные операции и функции без неявного расширения, использовать coder.sameSizeBinaryOp. Код, сгенерированный, чтобы применить эту функцию, не включает дополнительный код, чтобы расширить операнды. Выход этой функции не расширяет операнды в MATLAB. Эта функция не поддерживает скалярное расширение. Операнды должны быть одного размера.

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

Изменение эффективности

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

Если сгенерированный код не совпадает с требованиями к производительности вашего рабочего процесса из-за неявного расширения, сгенерируйте код для своего проекта путем выключения неявного расширения для определенных бинарных операций, определенных тел функции, или для целого проекта. Смотрите Оптимизируют Неявное расширение в Сгенерированном коде.

Примечание

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

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

|

Похожие темы