Simulink® поддерживает co-симуляцию между компонентами с помощью локальных решателей, или это включает инструменты симуляции. Например, co-симуляция может включить S-функцию, реализованную как шлюз co-симуляции между Simulink и сторонними программами или пользовательским кодом. Это может также вовлечь FMU в режим co-симуляции, импортированный в Simulink.
Чтобы улучшать производительность, рассмотрите под управлением модели, которые содержат блоки co-симуляции (компоненты) на нескольких потоках если:
Вы интегрируете несколько компонентов co-симуляции
Интегрирование на уровне компонента в вычислительном отношении интенсивно
Эта тема принимает, что вы знакомы с многопоточным программированием и концепциями.
Simulink позволяет вам запустить S-функции MEX C и блоки Co-Simulation FMU на нескольких потоках, если они удовлетворяют этим требованиям:
Блок является непрямым сквозным соединением.
Блок ориентирован на многопотоковое исполнение, то есть, блок может работать с несколькими разделяемыми данными доступа потоков, ресурсы и объекты без любых конфликтов.
Многопоточная co-симуляция для блоков Level-2 MATLAB S-Function не поддержана.
По умолчанию Simulink конфигурирует все модели, чтобы работать на нескольких потоках. Однако не все модели имеют компоненты co-симуляции, которые могут работать на нескольких потоках, и не всем преимуществе моделей от работы нескольких потоков. Чтобы видеть, имеет ли модель компоненты co-симуляции, которые могут извлечь выгоду из работы нескольких потоков, выполнить эти шаги:

Откройте свою модель.
Запустите инструмент Performance Advisor (на вкладке Debug, нажмите Performance Advisor).
Выберите Simulation> Checks that Require Simulation to Run> Select multi-thread co-simulation setting on or off.
Эта проверка проверяет, что модель или блок оптимально сконфигурированы, чтобы использовать в своих интересах многопоточную или однопоточную обработку. Если настройка не оптимальна, Performance Advisor показывает текущую установку и предупреждает вас, что модель не является хорошим кандидатом, чтобы работать на нескольких потоках.
Осуществите выбранную проверку.
В качестве альтернативы можно вручную измерить симуляцию модели до и после изменения MultiThreadCoSim параметр. Например:
tic; sim('sfunction_components'); tocElapsed time is 2.323264 seconds.
get_param(gcs,'MultiThreadCoSim')ans = 'on'
set_param(gcs,'MultiThreadCoSim','off')
tic; sim('sfunction_components'); tocElapsed time is 4.112674 seconds.
Для примера рабочих компонентов co-симуляции на нескольких ядрах смотрите slexCoSimPrimeExample модель.
MultiThreadCoSim ПараметрМожно указать, что целая модель работает на нескольких потоках или указывает, что конкретные блоки работают на нескольких потоках, с помощью MultiThreadCoSim параметр. Укажите, что целая модель работает на нескольких потоках, если все блоки co-симуляции в модели являются непрямым сквозным соединением и ориентированный на многопотоковое исполнение. Если некоторые, но не все блоки, являются непрямым сквозным соединением и ориентированный на многопотоковое исполнение, идентифицируют только те блоки, чтобы работать на нескольких потоках. Модель и блоки используют MultiThreadCoSim параметр можно следующим образом.
| Установка | Модель | Блок | Описание |
|---|---|---|---|
|
| Модель (По умолчанию) может работать на нескольких потоках. | |
|
|
| Отключите блок или модель от работы нескольких потоков. |
|
| (Значение по умолчанию) Позволило Simulink решить, может ли блок работать на нескольких потоках. |
Включение MultiThreadCoSim параметр не означает, что блок или модель симулируют на нескольких потоках. Симуляция на нескольких потоках происходит когда MultiThreadCoSim включен и:
Блок и/или модель действуют на одном уровне.
Блок и/или модель ориентированы на многопотоковое исполнение. (Например, они не используют статические или глобальные данные).
Блок и/или модель являются непрямым сквозным соединением.
Для Блоков s-function используйте ssSetInputPortDirectFeedThrough функция.
Для блоков FMU оставьте dependencies припишите в файле описания модели FMU для ModelStructure/Outputs FMU и ModelStructure/InitialUnknowns поле как пустое. Этот атрибут должен быть (" ").
Блок и/или модель без исключений. Для Блоков s-function используйте ssSetOptions функционируйте, чтобы установить SS_OPTION_EXCEPTION_FREE_CODE.
Многопоточность не позволяет проверки сброса решателя, и поэтому перескакивает через любое использование ssSetSolverNeedsReset и ssBlockStateForSolverChangedAtMajorStep функции. С другой стороны, в режиме 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-симуляции.
Когда блок имеет эти настройки, он не поддерживает 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)Опции должен включать SS_OPTION_EXCEPTION_FREE_CODE.
Должен быть в режиме co-симуляции.
Должно быть ориентировано на многопотоковое исполнение, то есть, несколько FMUs не должны получать доступ к тому же файлу одновременно.
Логгирование отладки должно быть отключено — Например, set_param(block1,'FMUDebugLogging','on')
Перенаправление логгирования отладки установлено в Файл — Например, set_param(block1,'FMUDebugLoggingRedirect','File')
Не может осушить порты IRT для планирования.
Не может быть в для - каждая подсистема.
Должен быть в режиме Accelerator.
Должен иметь один уровень.
Не может использовать блоки с переменным шагом расчета.
Не может иметь непрерывных состояний.
Не может иметь прямого сквозного соединения ни на каком входном порте.
Должен иметь решатель фиксированного шага.
Не может получить доступ ни к каким хранилищам глобальных данных.
Не может использовать функции Simulink или блоки вызывающей стороны.
Не может содержать блоки To/From File.
FMU | S-Function | ssGetRuntimeThreadSafetyCompliance | ssSetRuntimeThreadSafetyCompliance