Оптимизируйте сгенерированный код при помощи меток сигнала, чтобы вести буферное повторное использование

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

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

Модель в качестве примера

Модель rtwdemo_label_guided_reuse демонстрирует, как можно использовать метки сигнала, чтобы запросить буферное повторное использование для сигналов ввода и вывода блока. Для этой модели генератор кода может использовать ту же переменную для Атомарной подсистемы и любого блок Gain или Saturation выходные параметры. Сгенерированный код использует ту же переменную для блока Saturation и Atomic Subsystem выходные параметры, потому что те сигналы содержат ту же метку, и параметр Use Signal Labels to Guide Buffer Reuse выбран.

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

  1. Откройте модель.

    model='rtwdemo_label_guided_reuse';
    open_system(model);
  2. В диалоговом окне Configuration Parameters очистите параметр Use Signal Labels to Guide Buffer Reuse.

  3. Создайте модель. Функция rtwdemo_label_guided_reuse_step содержит этот код:

    void rtwdemo_label_guided_reuse_step(void)
    {
      real_T rtb_Saturation[4];
      real_T rtb_Bias[4];
      int32_T i;
      AtomicSubsystem(rtU.In1, rtb_Bias);
      for (i = 0; i < 4; i++) {
        if (rtb_Bias[i] > 10.0) {
          rtb_Saturation[i] = 10.0;
        } else if (rtb_Bias[i] < -10.0) {
          rtb_Saturation[i] = -10.0;
        } else {
          rtb_Saturation[i] = rtb_Bias[i];
        }
    
        rtb_Bias[i] *= 3.0;
      }
    
      AtomicSubsystem1(rtb_Saturation, rtb_Bias, rtY.Out1);
    }
    По умолчанию, в цикле for, блок Gain выполняется после блока Saturation. Сгенерированный код использует ту же переменную для вывода Атомарной подсистемы и блоков Усиления. В результате сгенерированный код содержит две локальных переменные rtb_Saturation и rtb_Bias для содержания промежуточных результатов.

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

В диалоговом окне Configuration Parameters выберите параметр Use Signal Labels to Guide Buffer Reuse и создайте модель. Функция rtwdemo_label_guided_reuse_step содержит этот код:

void rtwdemo_label_guided_reuse_step(void)
{
  real_T rtb_Gain1[4];
  int32_T i;
  AtomicSubsystem(rtU.In1, rtY.Out1);
  for (i = 0; i < 4; i++) {
    rtb_Gain1[i] = 3.0 * rtY.Out1[i];
    if (rtY.Out1[i] > 10.0) {
      rtY.Out1[i] = 10.0;
    } else {
      if (rtY.Out1[i] < -10.0) {
        rtY.Out1[i] = -10.0;
      }
    }
  }

  AtomicSubsystem1(rtY.Out1, rtb_Gain1, rtY.Out1);
}

Генератор кода изменил порядок выполнения блока так, чтобы в цикле for, блок Saturation выполнился после блока Gain. Сгенерированный код содержит одну локальную переменную rtb_Gain1 для содержания промежуточных результатов.

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

Используя основанное на метке повторное использование по сравнению с допускающими повторное использование пользовательскими классами памяти

Можно также использовать тот же Reusable пользовательская спецификация класса памяти на различных сигнальных линиях, чтобы задать который буферы к повторному использованию. По сравнению с использованием Reusable пользовательские классы памяти, с помощью меток сигнала, чтобы задать повторное использование обладает этими преимуществами:

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

  • Генератор кода не обеспечивает сигнал с меткой, чтобы быть глобальной переменной в сгенерированном коде. Сигнал может быть локальной или глобальной переменной.

  • Сигналы с метками могут снова использовать буферы с сигналами, которые не имеют меток, таким образом, повторное использование среди локальных и глобальных переменных возможно.

Используя метки сигнала более консервативный метод определения повторного использования, чем использование Reusable пользовательские классы памяти. Генератор кода не реализует основанное на метке повторное использование, когда это может реализовать повторное использование при помощи Reusable пользовательские классы памяти в этих случаях:

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

  • Повторное использование на корневом импорте и портах выходного порта.

  • Повторное использование через модель - ссылку или контуры подсистемы.

  • В подсистеме буферизуйте повторное использование на посредническом сигнале и порте ввода или вывода.

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

Похожие темы