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

Если ваша модель имеет оптимальные настройки параметров для удаления копий данных, вы можете удалить дополнительные копии данных с помощью меток сигналов. После изучения сгенерированного кода и отчета Static Code Metrics Report и определения областей, где, по вашему мнению, возможно повторное использование буфера, можно добавить метки к сигнальным линиям. Если это возможно, генератор кода переупорядочивает операции блока, чтобы реализовать спецификацию повторного использования.

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

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

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

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

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

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

  3. Создайте модель. The 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. Сгенерированный код использует ту же переменную для выхода Атомарная подсистема и блоков Gain. В результате сгенерированный код содержит две локальные переменные rtb_Saturation и rtb_Bias для проведения промежуточных результатов.

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

В диалоговом окне Параметров конфигурации выберите параметр Use Signal Labels to Guide Buffer Reuse и создайте модель. The 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 цикл, блок Насыщения выполняется после блока Gain. Сгенерированный код содержит одну локальную переменную rtb_Gain1 для проведения промежуточных результатов.

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

Использование переиспользуемых пользовательских Классов памяти на основе меток

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

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

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

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

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

  • Повторное использование, которое потенциально может предотвратить возникновение других оптимизаций в сгенерированном коде.

  • Повторно используйте в корневых портах inport и outport.

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

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

См. также

Похожие темы