Simulink® поддерживает co-симуляцию между компонентами с помощью локальных решателей, или это включает инструменты симуляции. Например, co-симуляция может включить S-функцию, реализованную как шлюз co-симуляции между Simulink и сторонними программами или пользовательским кодом. Это может также вовлечь FMU в режим co-симуляции, импортированный в Simulink.
Чтобы улучшать производительность, рассмотрите под управлением модели, которые содержат блоки co-симуляции (компоненты) на нескольких потоках если:
Вы интегрируете несколько компонентов co-симуляции
Интегрирование на уровне компонента в вычислительном отношении интенсивно
Эта тема принимает, что вы знакомы с многопоточным программированием и концепциями.
Simulink позволяет вам запустить S-функции MEX C и блоки Co-Simulation FMU на нескольких потоках, если они удовлетворяют эти требования:
Блок является непрямым сквозным соединением.
Блок ориентирован на многопотоковое исполнение, то есть, блок может работать с несколькими разделяемыми данными доступа потоков, ресурсы и объекты без любых конфликтов.
Многопоточная co-симуляция для Уровня 2 Блоки s-function MATLAB не поддержана.
По умолчанию Simulink конфигурирует все модели, чтобы работать на нескольких потоках. Однако не все модели имеют компоненты co-симуляции, которые могут работать на нескольких потоках, и не всем преимуществе моделей от работы нескольких потоков. Чтобы видеть, имеет ли модель компоненты co-симуляции, которые могут извлечь выгоду из работы нескольких потоков, выполнить эти шаги:
Откройте свою модель.
Запустите инструмент Performance Advisor (Analysis> Performance Tools> Performance Advisor).
Выберите Simulation> Checks that Require Simulation to Run> Select multi-thread co-simulation setting on or off.
Эта проверка проверяет, что модель или блок оптимально сконфигурированы, чтобы использовать в своих интересах многопоточную или однопоточную обработку. Если настройка не оптимальна, Советник по вопросам Производительности показывает текущую установку и предупреждает вас, что модель не является хорошим кандидатом, чтобы работать на нескольких потоках.
Осуществите выбранную проверку.
Также можно вручную измерить симуляцию модели до и после изменения параметра MultiThreadCoSim
. Например:
tic; sim('sfunction_components'); toc
Elapsed time is 2.323264 seconds.
get_param(gcs,'MultiThreadCoSim')
ans = 'on'
set_param(gcs,'MultiThreadCoSim','off')
tic; sim('sfunction_components'); toc
Elapsed time is 4.112674 seconds.
Для примера рабочих компонентов co-симуляции на нескольких ядрах см. модель slexCoSimPrimeExample
.
MultiThreadCoSim
Можно указать, что целая модель работает на нескольких потоках или указывает, что конкретные блоки работают на нескольких потоках, с помощью параметра MultiThreadCoSim
. Укажите, что целая модель работает на нескольких потоках, если все блоки co-симуляции в модели являются непрямым сквозным соединением и ориентированный на многопотоковое исполнение. Если некоторые, но не все блоки, являются непрямым сквозным соединением и ориентированный на многопотоковое исполнение, идентифицируют только те блоки, чтобы работать на нескольких потоках. Модель и блоки используют параметр MultiThreadCoSim
можно следующим образом.
Установка | Модель | Блок | Описание |
---|---|---|---|
| Модель (По умолчанию) может работать на нескольких потоках. | ||
| Отключите блок или модель от работы нескольких потоков. | ||
| (Значение по умолчанию) Позволило Simulink решить, может ли блок работать на нескольких потоках. |
Включение параметра MultiThreadCoSim
не означает, что блок или модель моделируют на нескольких потоках. Симуляция на нескольких потоках происходит, когда MultiThreadCoSim
включен и:
Блок и/или модель действуют на одном уровне.
Блок и/или модель ориентированы на многопотоковое исполнение. (Например, они не используют статические или глобальные данные).
Блок и/или модель являются непрямым сквозным соединением.
Для Блоков s-function используйте функцию ssSetInputPortDirectFeedThrough
.
Для блоков FMU оставьте атрибут dependencies
в файле описания модели FMU для поля FMU ModelStructure/Outputs
и ModelStructure/InitialUnknowns
как пустой. Этот атрибут должен быть (" "
).
Блок и/или модель без исключений. Для Блоков s-function используйте функцию ssSetOptions
, чтобы установить SS_OPTION_EXCEPTION_FREE_CODE
.
Многопоточность не позволяет проверки сброса решателя, и поэтому перескакивает через любое использование функций ssBlockStateForSolverChangedAtMajorStep
и ssSetSolverNeedsReset
. С другой стороны, в режиме Accelerator, если эти функции используются или существуют непрерывные состояния, многопоточность автоматически выключена.
Запускается ли Блок s-function один, или многопоточный зависит от значения параметров MultiThreadCoSim
и функции ssSetRuntimeThreadSafetyCompliance
.
Установка MultiThreadCoSim | Установка ssSetRuntimeThreadSafetyCompliance | Один или мультипоток |
---|---|---|
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN | Один поток |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE | Мультипоток |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE | Один поток |
'off' | — | Установка проигнорирована и однопоточные выполнения Блока s-function |
Симуляция работает на одном потоке для акселератора и быстрых режимов Accelerator.
Нет никакой генерации кода для компонентов co-симуляции.
Когда блок FMU имеет эти настройки, он не поддерживает co-симуляцию:
Должен иметь один уровень — ssSetSampleTime(SimStruct *S, int_T st_index, time_T period)
должен быть назван, чтобы указать только один дискретный уровень.
Должен иметь фиксированный шаг расчета — В time_T ssSetSampleTime(SimStruct *S, int_T st_index, time_T period)
, period
не может быть VARIABLE_SAMPLE_TIME
.
Не может иметь непрерывных состояний — В ssSetNumContStates(SimStruct *S, int_T n)
, n
должен быть 0
.
Не должен иметь никаких прямых проходных портов — В ssSetInputPortDirectFeedThrough(SimStruct *S, int_T port, int_T dirFeed)
, dirFeed
должен быть 0
для каждого входного порта.
Должно быть ориентировано на многопотоковое исполнение — В ssSetRuntimeThreadSafetyCompliance(SimStruct *S, int_T val)
, val
должен быть RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
.
Должно быть без исключений — В ssSetOptions(SimStruct *S, uint_T options)
, options
должен включать SS_OPTION_EXCEPTION_FREE_CODE
.
Должен быть в режиме co-симуляции.
Должно быть ориентировано на многопотоковое исполнение, то есть, несколько FMUs не должны получать доступ к тому же файлу одновременно.
Журналирование отладки должно быть отключено — Например, set_param(block1,'FMUDebugLogging','on')
Перенаправление журналирования отладки установлено в Файл — Например, set_param(block1,'FMUDebugLoggingRedirect','File')
Не может представить порты IRT для планирования.
Не может быть в для - каждая подсистема.
Должен быть в режиме Accelerator.
Должен иметь один уровень.
Не может использовать блоки с переменным шагом расчета.
Не может иметь непрерывных состояний.
Не может иметь прямого сквозного соединения ни на каком входном порте.
Должен иметь решатель фиксированного шага.
Не может получить доступ ни к каким хранилищам глобальных данных.
Не может использовать функции Simulink или блоки вызывающей стороны.
Не может содержать К/От блокам Файла.
FMU | S-функция | ssGetRuntimeThreadSafetyCompliance
| ssSetRuntimeThreadSafetyCompliance