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 (Анализ> Инструменты Производительности> Советник по вопросам Производительности).
Выберите Simulation> Checks, которые Требуют, чтобы Моделирование Запустилось> Избранная установка co-моделирования мультипотока на или прочь.
Эта проверка проверяет, что модель или блок оптимально сконфигурированы, чтобы использовать в своих интересах многопоточную или однопоточную обработку. Если настройка не оптимальна, Советник по вопросам Производительности показывает текущую установку и предупреждает вас, что модель не является хорошим кандидатом, чтобы работать на нескольких потоках.
Осуществите выбранную проверку.
Также можно вручную измерить моделирование модели до и после изменения параметра 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
.
Запускается ли Блок 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