Оптимизируйте сгенерированный код путем разработки и пользования заменяющими библиотеками кода - Simulink®

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

  • Оптимизация для определенной среды выполнения, включая, но не ограниченный, определенного целевого компьютера

  • Интеграция с кодом существующего приложения

  • Соответствие со стандартом, таким как AUTOSAR

  • Модификация поведения кода, такого как включение или отключение неличной или встроенной поддержки

  • Приложение - или специфичные для проекта требования кода, такие как использование BLAS или устранение math.h, системных заголовочных файлов или вызовов memcpy или memset.

Можно сконфигурировать модель, таким образом, что генератор кода пользуется заменяющей библиотекой кода, которую обеспечивает MathWorks®. Если у вас есть лицензия Embedded Coder®, можно разработать собственную заменяющую библиотеку кода в интерактивном режиме с Заменяющим Инструментом Кода или программно.

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

  • Просмотрите заменяющие табличные определения библиотеки кода от Заменяющего Средства просмотра Кода

  • Откройте табличный файл определения библиотеки в редакторе

  • Откройте регистрационный файл библиотеки в редакторе

  • Просмотрите настройку модели

  • Сгенерируйте код

Для получения дополнительной информации смотрите, Задают Заменяющие Отображения Кода и Заменяющие Отображения Регистра Кода.

Шаги для разработки заменяющей библиотеки кода

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

  2. Подготовьтесь к заменяющей разработке библиотеки кода (например, идентифицируйте или разработайте модели, чтобы протестировать вашу библиотеку).

  3. Задайте заменяющие отображения кода.

  4. Укажите информацию сборки для заменяющего кода.

  5. Укажите заменяющие отображения кода.

  6. Проверьте замены кода.

  7. Разверните библиотеку.

Для получения дополнительной информации смотрите Заменяющую Разработку Библиотеки Быстрого запуска Кода - Simulink®.

Замена математической функции

Этот пример задает и указывает заменяющие отображения кода для математических функций. Можно задать заменяющие отображения кода для множества функций (см. Код, который Можно Заменить Из Моделей Simulink).

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

Для получения дополнительной информации смотрите Замену Математической функции Кода.

open_system('rtwdemo_crlmath')

Оператор сложения и замена оператора вычитания

Этот пример показывает, как задать и указать заменяющие отображения кода для сложения (+) и вычитание (-) операции. При определении записей для операций сложения и операций вычитания, можно задать, какой из следующих алгоритмов (EntryInfoAlgorithm) реализуют библиотечные функции:

  • Бросок перед операцией (CBO) (RTW_CAST_BEFORE_OP), значение по умолчанию

  • Бросок после операции (CAO) (RTW_CAST_AFTER_OP)

1. Откройте модель rtwdemo_crladdsub. Модель показывает, как задать и указать заменяющие отображения кода для скалярного вычитания сложения (-) операции на двух операндах со следующими соединениями встроенных целочисленных типов данных:

  • int8, uint8

  • int16, uint16

  • int32, uint32

CBO, алгоритм по умолчанию, принят.

open_system('rtwdemo_crladdsub')

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

3. Исследуйте различия между CBO и алгоритмами CAO путем открытия модели rtwdemo_crl_cbo_cao. Модель показывает два блока SUM, каждый демонстрирующий одну из настроек алгоритма, чтобы совпадать с соответствующей заменяющей записью кода.

  • Для блока Cast_before_operation_Sub генератор кода вычисляет операцию вычитания в типе данных аккумулятора (int8), который меньше, чем входные данные вводят (int16). Это эквивалентно CBO, потому что генератор кода преобразовывает вход в тип выходных данных прежде, чем вычислить результат.

  • Для блока Cast_after_operation_Sub генератор кода вычисляет операцию вычитания в типе данных аккумулятора (int32), который больше, чем входные данные вводят (int16). Это эквивалентно CAO, потому что генератор кода приводит к тому же результату путем вычисления результата без потери области значений или точности прежде, чем преобразовать в тип выходных данных.

open_system('rtwdemo_crl_cbo_cao')

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

Для получения дополнительной информации о замене оператора сложения и оператора вычитания смотрите Замену Оператора сложения и Оператора вычитания Кода. Для получения дополнительной информации об алгоритме сложения и вычитания (EntryInfoAlgorithm) опции смотрите setTflCOperationEntryParameters.

Оператор умножения и замена оператора деления для встроенных Целых чисел

Этот пример задает и указывает заменяющие отображения кода для скалярного умножения (*) и деление (/) операции. Операции берут два операнда со следующими соединениями встроенных целочисленных типов данных:

  • int8, uint8

  • int16, uint16

  • int32, uint32

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

open_system('rtwdemo_crlmuldiv')

Скалярная замена оператора

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

Поддерживаемые типы включают:

  • один, дважды

  • int8, uint8

  • int16, uint16

  • int32, uint32

  • csingle, cdouble

  • cint8, cuint8

  • cint16, cuint16

  • cint32, cuint32

  • целые числа фиксированной точки

  • смешанные типы (другой тип на каждом входе)

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

Для получения дополнительной информации о скалярной замене оператора, Скалярной Замене Оператора Кода.

CBO, алгоритм по умолчанию для операций сложения и операций вычитания, принят.

open_system('rtwdemo_crlscalarops')

Замена матричного оператора

Этот пример задает и указывает заменяющие отображения кода для операций над матрицей: сложение, вычитание, умножение, перемещение, сопряженное, и Эрмитово.

Поддерживаемые типы включают:

  • single, double

  • int8, uint8

  • int16, uint16

  • int32, uint32

  • csingle, cdouble

  • cint8, cuint8

  • cint16, cuint16

  • cint32, cuint32

  • целые числа фиксированной точки

  • смешанные типы (другой тип на каждом входе)

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

Для получения дополнительной информации о замене матричного оператора смотрите Маленькую Операцию над матрицей к Замене Процессора Кода.

CBO, алгоритм по умолчанию для операций сложения и операций вычитания, принят.

open_system('rtwdemo_crlmatops')

Замена умножения матриц для BLAS

Этот пример задает и указывает заменяющие отображения кода для стандартных подпрограмм базовых подпрограмм линейной алгебры (BLAS) xGEMM и xGEMV. Можно сопоставить следующие операции со стандартной подпрограммой BLAS:

  • Умножение матриц

  • Умножение матриц с транспонирует на сингле или обоих входных параметрах

  • Умножение матриц с операцией Hermitian на сингле или обоих входных параметрах

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

Для получения дополнительной информации о замене умножения матриц для BLAS смотрите Операцию Умножения матриц к MathWorks BLAS Code Replacement.

open_system('rtwdemo_crlblas')

Замена оператора неподвижной точки для основных операторов

Этот пример задает и указывает заменяющие отображения кода для скалярного сложения (+), вычитание (-), умножение (*), и деление (/) операции. Операции берут два операнда с типами данных с фиксированной точкой.

Можно задать замены кода как соответствие:

  • Комбинация масштабирования наклона/смещения на входных параметрах и выводе

  • Комбинация масштабирования двоичной точки на входных параметрах и выводе

  • Относительное масштабирование между входными параметрами и вывод

  • То же наклонное значение и нулевое сетевое смещение через входные параметры и вывод.

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

  • По умолчанию, для замен оператора сложения и оператора вычитания кода, генератор кода принимает, что заменяющий код реализует алгоритм броска перед операцией (CBO).

  • Используя типы данных с фиксированной точкой в модели требует лицензии Fixed-Point Designer™.

Для получения дополнительной информации о замене оператора неподвижной точки кода, смотрите Замену Оператора неподвижной точки Кода.

open_system('rtwdemo_crlfixpt')

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

Этот пример задает и указывает заменяющие отображения кода для пользовательских записей. Можно создать собственную запись путем разделения на подклассы от RTW.TflCFunctionEntryML или RTW.TflCOperationEntryML. Ваш класс записи должен реализовать метод do_match, который настраивает ваше соответствие с логикой или изменяет совпадающую запись. Метод do_match должен иметь фиксированную предварительно установленную подпись.

Откройте модель rtwdemo_crlcustomentry. Модель показывает, как изменить совпадающую запись путем введения констант как дополнительных аргументов функции реализации. DTC1, Trigonometric Function и Product показывают пользовательскую замену записи кода для:

  • Бросьте операцию, которая демонстрирует, как извлечь дробные длины от типов и передать их в функцию реализации - Out1 = custom_cast(In1, 2, 4).

  • Синус, который демонстрирует, как передать постоянное значение функции реализации - Out2=custom_sin(In2, 1).

  • Операция Multiplication, которая демонстрирует, как вычислить сетевой наклон операции и передачи это в функцию реализации - Out3=custom_multiply_shift_right(In3,In4,3).

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

Для получения дополнительной информации о пользовательских записях смотрите, Настраивают Процесс Соответствия и Замены.

open_system('rtwdemo_crlcustomentry')

Замена функции MATLAB

Этот пример задает и указывает заменяющие отображения кода для функций MATLAB®, заданных в блоке MATLAB function. Функция может быть выбрана для замены путем определения coder.replace в нем. Эта функция поддерживает замену функций MATLAB® со следующим:

  • Один или несколько входных параметров

  • Один или несколько выходных параметров

  • Скалярные и матричные вводы и выводы

Откройте модель rtwdemo_crlcoderreplace. Модель показывает некоторые из этих требований. Поддерживаемые типы включают:

  • single, double

  • int8, uint8

  • int16, uint16

  • int32, uint32

  • csingle, cdouble

  • cint8, cuint8

  • cint16, cuint16

  • cint32, cuint32

  • Целые числа фиксированной точки

  • Смешанные типы (другой тип на каждом входе)

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

Для получения дополнительной информации о замене функции MATLAB® смотрите coder.replace.

open_system('rtwdemo_crlcoderreplace')

Выравнивание данных для реализаций функции

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

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

  • Задайте возможности выравнивания данных и синтаксис для вашего компилятора. Присоедините объект AlignmentSpecification к объекту TargetCharacteristics ключа реестра, заданного в вашем файле rtwTargetInfo.m.

Откройте модель rtwdemo_crlalign. Модель показывает три заменяющих сценария выравнивания данных кода:

  • Добавление- Выравнивание экспортируемых и импортированных сигналов. Можно задать точное значение для выравнивания в диалоговом окне Signal Properties или позволить генератору кода определять лучшее выравнивание на основе использования путем отъезда набора значений выравнивания-1.

  • Product - Выравнивание виртуальных и невиртуальных типов шины. Можно задать точное значение для выравнивания для свойства Alignment Simulink. Объект шины или позволяет генератору кода определять лучшее выравнивание на основе использования путем отъезда набора свойств Выравнивания-1.

  • EML_MMUL - Выравнивание локальных переменных, глобальных переменных и параметров блоков.

Используйте кнопки в нижней части окна модели, чтобы исследовать файлы, которые задают и указывают заменяющие отображения кода. Обратите внимание на то, что модель сконфигурирована, чтобы использовать GCC, Лязг, MSVC или компилятор MinGW.

Для получения дополнительной информации об определении выравнивания данных для замены кода смотрите Выравнивание Данных для Замены Кода.

open_system('rtwdemo_crlalign')

Увеличение производительности от выравнивания данных

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

1. Открытая модель rtwdemo_crlalignperf. Эта модель иллюстрирует основной алгоритм обработки изображений, представленный подсистемой Root/Filtering/Process/ALGORITHM. Слайды a алгоритма 5x5 обрабатывают по шаблону через изображение один пиксель за один раз. Область изображения, покрытая шаблоном, формирует другого 5x5 матрица. Эта матрица поэлементна умноженный на матрицу шаблона. Эти двадцать пять элементов в результирующей матрице суммированы вместе, чтобы сформировать новое значение для того пикселя. Это поэлементное умножение матриц выполняется для всех пикселей в изображении, таким образом, его эффективность оказывает значительное влияние на полную производительность алгоритма.

perf = 'rtwdemo_crlalignperf';
open_system(perf)

cc = rtwprivate('getCompilerForModel',perf);
isDaDemoSupported = strcmpi(cc.comp.Manufacturer,'GNU') || ...
                    strcmpi(cc.comp.Manufacturer,'Apple') || ...
                    strcmpi(cc.comp.Manufacturer,'Microsoft');
if ~isDaDemoSupported
  recMsg = ['Use "mex -setup" to select either GCC, Clang,'...
      'MSVC, or MinGW and restart this example'];
  warning(['The model "%s" is configured to use GCC, Clang,'...
      'MSVC, or MinGW to create a Data Aligned Executable. %s.'],...
      perf,recMsg); %#ok<CTPCT>
end

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

3. Выполнитесь пример двойным кликом Запускают Пример. Обратите внимание на то, что модель сконфигурирована, чтобы использовать GCC, Лязг, MSVC или компилятор MinGW. Этот пример компилирует модель дважды. Первая компиляция производит портативный, ANSI-C без выравнивания данных. Вторая компиляция пользуется заменяющей библиотекой кода SIMD, которая делает поэлементное, умножение матриц с помощью инструкций SIMD. Данные, на которых инструкции SIMD управляют потребностями, которые будут выровнены на 16-байтовом контуре. Для обеих компиляций сгенерированный код профилируется профильным рычагом. После завершенных компиляций данные, кажется, показывают сравнение времени выполнения подсистемы Root/Filtering/Process/ALGORITHM с и без выравнивания данных.

4. Сгенерируйте базовую линию путем выбора библиотеки ANSI®, создавания модели, и затем выполнения сгенерированного исполняемого файла десять раз. Эта модель использует поэлементную операцию умножения матриц в качестве части алгоритма обработки изображений. Умножение матриц выполняется многочисленные времена, когда каждый пиксель в изображении обрабатывается. Профилирование времени рычагов выполнение исполняемого файла.

if (isDaDemoSupported)
  % Create a temporary folder (in your system's temporary folder) for the
  % build and inspection process.
  currentDir = pwd;
  [~,cgDir] = rtwdemodir();

  set_param(perf, 'CodeReplacementLibrary','None'...
      , 'TargetLangStandard','C89/C90 (ANSI)');
  rtwbuild(perf);
  iterations = 10;
  T1 = zeros(iterations, 1);
  for idx = 1:iterations
      evalc(['!', fullfile('.', perf)]);
      evalc(['load ', fullfile('.','rtwdemo_crlalignperf.mat')]);
      T1(idx) = rt_yout.signals(1).values;
  end
  if exist('rtwdemo_crlalignperf_ANSI', 'dir')
      rmdir('rtwdemo_crlalignperf_ANSI', 's');
  end
  movefile('rtwdemo_crlalignperf_ert_rtw', 'rtwdemo_crlalignperf_ANSI');
else
  warning('Unable to build model "%s". %s.', perf,recMsg);
end
### Starting build procedure for model: rtwdemo_crlalignperf
### Successful completion of build procedure for model: rtwdemo_crlalignperf

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

if (isDaDemoSupported)
  crl=getCorrectCrlForSelectedCompiler(perf);
  set_param(perf,'CodeReplacementLibrary',crl);
  rtwbuild(perf);
  T2 = zeros(iterations, 1);
  for idx=1:iterations
      evalc(['!', fullfile('.', perf)]);
      evalc(['load ', fullfile('.','rtwdemo_crlalignperf.mat')]);
      T2(idx) = rt_yout.signals(1).values;
  end
  if exist('rtwdemo_crlalignperf_SIMD', 'dir')
      rmdir('rtwdemo_crlalignperf_SIMD','s');
  end
  movefile('rtwdemo_crlalignperf_ert_rtw', 'rtwdemo_crlalignperf_SIMD');
else
  warning(...
      'The Data Aligned Executable for the model "%s" could not be generated. %s.'...
          ,perf,recMsg);
end
### Starting build procedure for model: rtwdemo_crlalignperf
### Successful completion of build procedure for model: rtwdemo_crlalignperf

6. Сравните результаты синхронизации базовых и выровненных данными исполняемых файлов. Данные о синхронизации, собранные от выполнения базовых и выровненных данными исполняемых файлов, отображены в графике. График иллюстрирует, что использование операций SIMD с выравниванием данных может эффективно ускорить выполнение параллельных данным операций.

if (isDaDemoSupported)
  T1(T1<0) = NaN;    % The profile counter may overflow.
  T2(T2<0) = NaN;
  t = [min(T1), min(T2)];
  h = figure;

  bar([NaN, t(1), NaN, t(2), NaN]);
  set(gca, 'XLim', [0.5, 5.5], 'XTickLabel',...
      {'', 'ANSI Multiply', '', 'SIMD Multiply', ''}, ...
           'TickLength', [0 0], 'YLim', [0, max(t) * 1.3], 'YTick', []);
  ylabel('Execution Time (CPU Cycles)');
  % annotate the plot
  annotation('textbox', get(gca, 'Position'), ...
             'String', ['Execution Speed Increased By: ',...
             num2str((1 - t(2)/t(1))*100, '%2.0f'), '%'], ...
             'LineStyle', 'none', 'FitBoxToText', 'off',...
             'FitHeightToText', 'on', ...
             'FontWeight', 'bold', 'FontSize', 12,...
             'HorizontalAlignment', 'center');
  % annotate first bar (simple multiply without alignment)
  text('Position', [2, t(1)], 'String', int2str(t(1)),...
      'LineStyle', 'none', ...
       'FontSize', 12, 'HorizontalAlignment', 'center',...
       'VerticalAlignment', 'bottom');

  % annotate second bar (SIMD Multiply without alignment)
  text('Position', [4, t(2)],  'String', int2str(t(2)),...
      'LineStyle', 'none', ...
       'FontSize', 12, 'HorizontalAlignment', 'center',...
       'VerticalAlignment', 'bottom');
else
  warning(['The Data Alignment Performance Gain example'...
      ' could not be executed. %s.'], recMsg);
end

Заменяющее исследование библиотеки кода и верификация

Этот пример показывает Заменяющее Средство просмотра Кода. Можно использовать Заменяющее Средство просмотра Кода для:

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

  • Проверьте список таблиц в библиотеке и записей в каждой таблице

  • Рассмотрите спецификации записи таблицы

  • Диагностируйте замену кода промахи

Следующие команды открывают Заменяющее Средство просмотра Кода для заменяющей таблицы crl_tablemuldiv кода:

crl = crl_table_muldiv;
crviewer(crl);
daRoot = DAStudio.Root;
me = daRoot.find('-isa', 'DAStudio.Explorer');

Для получения дополнительной информации о Заменяющем Средстве просмотра Кода смотрите, Проверяют Замены Кода.

Создайте информацию

Для каждой записи в заменяющей таблице кода можно указать информацию сборки, такую как следующее для заменяющих функций:

  • Зависимости от заголовочного файла

  • Зависимости от исходного файла

  • Дополнительный включают пути

  • Дополнительные исходные пути

  • Дополнительные флаги ссылки

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

  • Свойство GenCallback в вызове setTflCFunctionEntryParameters, setTflCOperationEntryParameters или setTflCSemaphoreEntryParameters.

  • Аргумент genCallback в вызове registerCFunctionEntry, registerCOperationEntry или registerCSemaphoreEntry.

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

Для получения дополнительной информации об указывании информации сборки смотрите, Указывают информацию Сборки для Заменяющего Кода.

Зарезервированные идентификаторы

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

Для получения дополнительной информации об определении зарезервированных идентификаторов смотрите Зарезервированные Идентификаторы и Замену Кода.

Удалите заменяющие библиотеки примера кода

Когда вы закончили использовать модели в качестве примера, удаляете заменяющие библиотеки примера кода и закрываете модели в качестве примера с этими командами:

rmpath(fullfile(matlabroot,'toolbox','rtw','rtwdemos','crl_demo'));
sl_refresh_customizations;

close_system('rtwdemo_crladdsub', 0)
close_system('rtwdemo_crl_cbo_cao', 0)
close_system('rtwdemo_crlmuldiv', 0)
close_system('rtwdemo_crlfixpt', 0)
close_system('rtwdemo_crlmath', 0)
close_system('rtwdemo_crlmatops', 0)
close_system('rtwdemo_crlblas', 0)
close_system('rtwdemo_crlscalarops', 0)
close_system('rtwdemo_crlcustomentry', 0)
close_system('rtwdemo_crlcoderreplace', 0)
close_system('rtwdemo_crlalign', 0)
close_system(perf, 0)

drawnow;
if exist('h','var') && ishghandle(h)
  close(h);
end

if ~isempty(me)
    me(end).delete;
end

clear h;
clear crl;
clear codersrc;
clear codercurdir;
clear n1;
clear me;
clear cfg;
clear t;
clear cc;
clear recMsg;
clear isDaDemoSupported;
clear T1;
clear T2;
clear idx;
clear iterations;
clear rt_tout;
clear rt_yout;
clear crl;
clear perf;

rtwdemoclean;
cd(currentDir)