Если ваша модель имеет оптимальные настройки параметров для удаления копий данных, вы можете удалить дополнительные копии данных с помощью меток сигналов. После изучения сгенерированного кода и отчета Static Code Metrics Report и определения областей, где, по вашему мнению, возможно повторное использование буфера, можно добавить метки к сигнальным линиям. Если это возможно, генератор кода переупорядочивает операции блока, чтобы реализовать спецификацию повторного использования.
Установка значения повторного использования буфера повышает скорость выполнения и может снизить потребление оперативной памяти.
Модель rtwdemo_label_guided_reuse
демонстрирует, как можно использовать метки сигнала для запроса повторного использования буфера для входных и выходных сигналов блоков. Для этой модели генератор кода может использовать ту же переменную для Атомарной подсистемы и выходов блоков Gain или Saturation. Сгенерированный код использует ту же переменную для выходов блоков Saturation и Атомарная Подсистема, потому что эти сигналы содержат ту же метку и выбран параметр Use Signal Labels to Guide Buffer Reuse.
Откройте модель.
model='rtwdemo_label_guided_reuse'; open_system(model);
В диалоговом окне Параметров конфигурации очистите параметр Use Signal Labels to Guide Buffer Reuse.
Создайте модель. 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.
Повторно используйте через модель-ссылку или контуров подсистемы.
Внутри подсистемы буфер повторно использует промежуточный сигнал и вход или выход порт.
Используйте метки сигнала, чтобы направить повторное использование буфера