Уменьшите копии данных для блоков назначения шины

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

Пример модели

Для примера, в bus_assignoptimсигнал шины, содержащий шесть элементов, поступает в блок Bus Assignment и блок Bus Selector. Блок Bus Assignment присваивает новые значения элементу шины a1_real_array. Этот сигнал шины поступает в Out1.

Сгенерируйте код без оптимизации

Сгенерируйте код без оптимизации, установив параметр Perform in-place updates for Assignment and Bus Assignment blocks равным off. Без оптимизации bus_assignoptim_step функция содержит этот код:

void bus_assignoptim_step(void)
{
  real_T rtb_Assignment[36];
  int32_T i;

  /* Assignment: '<Root>/Assignment' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   *  Product: '<Root>/Product'
   *  Selector: '<Root>/Selector'
   *  Sum: '<Root>/Sum1'
   */
  for (i = 0; i < 36; i++) {
    rtb_Assignment[i] = bus_assignoptim_U.In1.a1_real_array[i];
  }

  for (i = 0; i < 2; i++) {
    rtb_Assignment[(int32_T)(i + 22)] = (bus_assignoptim_U.In1.a1_real_array
      [(int32_T)(i + 22)] + bus_assignoptim_U.In1.a1_num) *
      bus_assignoptim_U.In2;
  }

  /* End of Assignment: '<Root>/Assignment' */

  /* Outport: '<Root>/Out' incorporates:
   *  BusAssignment: '<Root>/Bus Assignment'
   *  Inport: '<Root>/In1'
   */
  bus_assignoptim_Y.Out = bus_assignoptim_U.In1;

  /* BusAssignment: '<Root>/Bus Assignment' incorporates:
   *  Outport: '<Root>/Out'
   */
  for (i = 0; i < 36; i++) {
    bus_assignoptim_Y.Out.a1_real_array[i] = rtb_Assignment[i];
  }
}
Сгенерированный код содержит временный массив rtb_Assignment для хранения данных перед присвоением этих данных bus_assignoptim_Y.Out.a1_real_array.

Сгенерируйте код с оптимизацией

Сгенерируйте код с оптимизацией путем установки параметра Perform in-place updates for Assignment and Bus Assignment blocks на on. С оптимизацией, bus_assignoptim_step функция содержит этот код:

/* Model step function */
void bus_assignoptim_step(void)
{
  int32_T i;

  /* Outport: '<Root>/Out' incorporates:
   *  Inport: '<Root>/In1'
   *  SignalConversion: '<Root>/TmpBusAssignmentBufferAtBus AssignmentInport1'
   */
  bus_assignoptim_Y.Out = bus_assignoptim_U.In1;

  /* Assignment: '<Root>/Assignment' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   *  Outport: '<Root>/Out'
   *  Product: '<Root>/Product'
   *  Selector: '<Root>/Selector'
   *  Sum: '<Root>/Sum1'
   */
  for (i = 0; i < 36; i++) {
    bus_assignoptim_Y.Out.a1_real_array[i] =
      bus_assignoptim_U.In1.a1_real_array[i];
  }

  for (i = 0; i < 2; i++) {
    bus_assignoptim_Y.Out.a1_real_array[(int32_T)(i + 22)] =
      (bus_assignoptim_U.In1.a1_real_array[(int32_T)(i + 22)] +
       bus_assignoptim_U.In1.a1_num) * bus_assignoptim_U.In2;
  }

  /* End of Assignment: '<Root>/Assignment' */
}
Сгенерированный код не содержит временного массива rtb_Assignment1 для хранения данных. Сгенерированный код непосредственно присваивает эти данные bus_assignoptim_Y.Out.a1_real_array.

См. также

Похожие темы