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'); 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 для 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-симуляции.
Когда блок 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)
Опции
должен включать 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