exponenta event banner

Оптимизация сгенерированного кода с помощью сигнальных меток для управления повторным использованием буфера

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

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

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

Модель rtwdemo_label_guided_reuse демонстрирует, как можно использовать метки сигналов для запроса повторного использования буфера для входных и выходных сигналов блоков. Для этой модели генератор кода может использовать одну и ту же переменную для атомной подсистемы и выходов блока усиления или насыщения. Сгенерированный код использует одну и ту же переменную для выходных сигналов блока «Насыщенность» и «Атомная подсистема», поскольку эти сигналы содержат одну и ту же метку, и выбран параметр «Использовать метки сигналов для направления повторного использования буфера».

Создание кода без оптимизации

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

    model='rtwdemo_label_guided_reuse';
    open_system(model);
  2. В диалоговом окне «Параметры конфигурации» снимите флажок «Использовать метки сигналов для управления повторным использованием буфера».

  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 цикл, блок усиления выполняется после блока насыщения. Сгенерированный код использует одну и ту же переменную для вывода блоков Atomic Subsystem и Gain. В результате созданный код содержит две локальные переменные. 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 цикл, блок Насыщения выполняется после блока усиления. Созданный код содержит одну локальную переменную rtb_Gain1 для удержания промежуточных результатов.

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

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

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

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

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

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

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

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

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

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

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

См. также

Связанные темы