Simulink® поддерживает совместное моделирование между компонентами с помощью локальных решателей или с использованием инструментов симуляции. Для примера ко-симуляция может включать S-функцию, реализованную как шлюз ко-симуляции между Simulink и сторонними программами или пользовательским кодом. Это также может включать FMU в режиме ко-симуляции, импортированном в Simulink или блок Model в режиме Accelerator.
Чтобы улучшить эффективность, рассмотрите выполнение моделей, которые содержат блоки ко-симуляции (компоненты) в нескольких потоках, если:
Вы интегрируете несколько компонентов ко-симуляции
Интегрирование на уровне компонентов является в вычислительном отношении интенсивной
Эта тема предполагает, что вы знакомы с многопоточным программированием и концепциями.
Simulink позволяет запускать S-функции C MEX, блоки Co-Simulation FMU и блоки Model, настроенные для режима Accelerator, на нескольких потоках, если они являются threadsafe. Быть threadsafe означает, что блок может работать с несколькими потоками, получая доступ к разделяемым данным, ресурсам и объектам без каких-либо конфликтов.
Можно также запустить модель на нескольких потоках, если модель имеет недиректный блок с прямой передачей, за которым следует блок с прямой передачей (см. «Singlethreaded Versh Multithreaded Simulations»). Прямое сквозное соединение означает, что сигнал выхода порта блока вычисляется из значений его сигналов входа порта в том же временном шаге.
Примечание
Многопоточное совместное моделирование для блоков Level-2 MATLAB S-Function не поддерживается.
По умолчанию Simulink конфигурирует все модели для выполнения в нескольких потоках. Если эффективность может быть улучшена, Simulink автоматически запускает все модели в нескольких потоках. Однако не все модели имеют компоненты ко-симуляции, которые могут запускаться в нескольких потоках, и не все модели получают преимущества от работы в нескольких потоках.
При оценке модели для возможных совпадений в вашей системе для многопоточного выполнения Simulink использует основанный на графе алгоритм, чтобы анализировать зависимости данных среди подходящих блоков и сформировать несколько групп задач. Этот алгоритм гарантирует, что группы различной задачи:
Не имеют зависимости данных друг от друга
Может выполняться параллельно с использованием нескольких ядер
Например, Simulink может искать непрямые сквозные соединения, за которыми следуют блоки с прямым сквозным соединением. Если следующие блоки прямого сквозного соединения зависят только от блока ненаправленной передачи, программное обеспечение может сгруппировать блоки в одной ветви для параллельного выполнения.
В этом примере сравнивается последовательное выполнение серии блоков, разделенных для параллельного выполнения.
Рассмотрим Graph-Based Multithread Simulation
пример, который использует четыре недиректных исходных блока, за которыми следуют четыре прямых исходных блока. Прямое сквозное соединение означает, что сигнал выхода порта блока вычисляется из значений его сигналов входа порта в том же временном шаге.
Simulink анализирует зависимости данных и формирует четыре ветви. Каждая ветвь содержит ненаправленные сквозные соединения, за которыми следуют блоки с прямым сквозным соединением. Затем Simulink использует многопоточность, чтобы запустить эти четыре ветви. Таким образом, Simulink может ускорить симуляцию до четырех раз на четырёх или более центральных машинах по сравнению с однослойной симуляцией на той же машине. Можно вручную измерить симуляцию модели до и после изменения MultithreadedSim
параметр.
Можно вручную измерить симуляцию модели до и после изменения MultithreadedSim
параметр. Этот код показывает, как измерить симуляцию для Graph-Based Multithread Simulation
пример:
openExample('slexGraphBasedMultiThreadSimExample');... set_param(gcs,'MultithreadedSim','off'); tic;sim('slexGraphBasedMultiThreadSimExample');toc
Elapsed time is 39.406743 seconds.
set_param(gcs,'MultithreadedSim','on'); tic;sim('slexGraphBasedMultiThreadSimExample'); toc
Elapsed time is 13.619744 seconds.
В этом примере скорость почти в три раза (вместо четырех раз) на четырёхъядерной машине. Это связано с дополнительными издержками, вызванными коммутатором контекста потока операционной системы.
MultithreadedSim
ПараметрМожно задать, что целая модель выполняется в нескольких потоках, или указать, что конкретные блоки выполняются в нескольких потоках, используя MultithreadedSim
параметр. Задайте, что вся модель работает на нескольких потоках, если все блоки ко-симуляции в модели являются threadsafe. Если некоторые, но не все блоки являются threadsafe, идентифицируйте только те блоки, которые выполняются в нескольких потоках. Модель и блоки используют MultithreadedSim
параметр следующим образом:
Настройка | Описание |
---|---|
| (По умолчанию) Позвольте Simulink решить, может ли блок запускаться в нескольких потоках. |
| Отключите блок или модель от выполнения в нескольких потоках. |
[a] Начиная с R2021a, когда вы открываете модель, созданную в предыдущем релизе, Simulink интерпретирует |
Включение MultithreadedSim
параметр не означает, что блок или модель моделируется на нескольких потоках. Симуляция на нескольких потоках происходит при MultithreadedSim
включено и:
Блок и/или модель работают с одной скоростью.
Блок и/или модель являются threadsafe. (Например, они не используют статические или глобальные данные).
Блок и/или модель свободны от исключений. Для блоков s-function используйте ssSetOptions
функция, чтобы задать SS_OPTION_EXCEPTION_FREE_CODE
.
Многопоточность не позволяет проверять сброс решателя, и поэтому пропускает любое использование ssSetSolverNeedsReset
и ssBlockStateForSolverChangedAtMajorStep
функций. И наоборот, в режиме Accelerator, если эти функции используются или существуют непрерывные состояния, многопоточность автоматически отключается.
Выполняет ли блок s-function одну или многопоточно, зависит от MultithreadedSim
значение параметров и ssSetRuntimeThreadSafetyCompliance
функция.
MultithreadedSim Настройка | ssSetRuntimeThreadSafetyCompliance Настройка | Одно или многопоточное |
---|---|---|
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN | Один поток |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE | Мультинить |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE | Один поток |
'off' | — | Установка игнорируется, и блок s-function запускается в одиночном виде |
Симуляция выполняется на одной нити для режимов Accelerator и Rapid Accelerator. Многопоточность активируется, когда режим симуляции нормальный.
Установите режим симуляции модели в нормальное состояние.
Генерация кода для компонентов ко-симуляции отсутствует.
Когда блок имеет эти настройки, он не поддерживает совместное моделирование.
Многопоточность не активируется для блоков с постоянным шагом расчета.
Многопоточность не включена, когда включен отладчик Simulink.
Отключите отладчик Simulink.
Блок, который зависит от блока, не защищенного от потоков, не может быть многопоточным. Рассмотрите разрыв зависимости, например, при помощи блока Unit Delay.
Должна быть единственная ставка.
Рассмотрите пересмотр вашей модели, чтобы разбить мультирейтовые компоненты на отдельные однорейтовые компоненты.
Многопоточность не активируется, когда S-функция имеет переменный шаг расчета.
Рассмотрите использование другого шага расчета (см. «Задание шага расчета»).
Многопоточность не активируется, когда S-функция имеет непрерывные состояния, и решатель является фиксированным - шагом, который вместе запускает непрерывную проверку согласованности состояний. Чтобы отключить непрерывные проверки согласованности состояний, используйте ssSetSkipContStatesConsistencyCheck
функция.
Должна быть безопасной резьбы - В ssSetRuntimeThreadSafetyCompliance(SimStruct *S,int_T val)
, val
должен быть RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE
.
Для получения дополнительной информации смотрите Руководство по записи Thread-Safe S-Functions.
Должно быть без исключений - В ssSetOptions(SimStruct *S,uint_T options)
, options
должны включать SS_OPTION_EXCEPTION_FREE_CODE
.
Для получения дополнительной информации смотрите Руководство по записи Thread-Safe S-Functions.
Многопоточность не включена, когда анализатор S-функций включен. Попробуйте многопоточность в режим normal mode.
Многопоточность не активируется, когда S-функция имеет непрерывный шаг расчета. Рассмотрите использование другого шага расчета (см. «Задание шага расчета»).
Многопоточность одновременно запускает методы выхода и обновления. Блок должен иметь выход или обновления.
Должен быть в режиме ко-симуляции.
Рассмотрите переключение режима FMU с Model Exchange на Ко-симуляцию.
Должна быть безопасной для потоков, примеры несколько FMU не должны одновременно обращаться к одному и тому же файлу.
Многопоточность не включена, когда в MATLAB отображается логгирование блоков FMU® командное окно. Перенаправьте ведение журнала блоков FMU в файл с помощью:
set_param(blockName,'FMUDebugLoggingRedirect','File')
Многопоточность не поддерживается, когда FMU завершает работу. Чтобы отключить эту настройку, используйте:
set_param(blockName,'DebugExecutionForFMUViaOutOfProcess','off')
Многопоточность не включена, когда блок Model имеет порты событий.
Не может находиться внутри блока For Each Subsystem.
Рассмотрите перемещение Model блока из For Each Subsystem блока.
Должен быть в режиме Accelerator.
Должна иметь одну ставку.
Рассмотрите пересмотр вашей модели, чтобы разбить мультирейтовые компоненты на отдельные однорейтовые компоненты.
Невозможно использовать блоки с переменным шагом расчета.
Рассмотрите использование другого шага расчета (см. «Задание шага расчета»).
Не может иметь непрерывных состояний.
Рассмотрите разрыв зависимости между блоками, например, при помощи блока Unit Delay.
Должен иметь решатель с фиксированным шагом.
Не удается получить доступ к глобальным данным хранилищам.
Многопоточность не активируется, когда модель содержит блок Simulink Function.
Невозможно использовать какие-либо функции Simulink или блоки вызывающего абонента.
Не может содержать To File блоков. Для получения дополнительной информации смотрите Экспорт данных моделирования.
Не может содержать From File блоков.
Рассмотрите подачу данных в модель-ссылку через входной порт из модели верхнего уровня.
FMU | S-Function | ssGetRuntimeThreadSafetyCompliance
| ssSetRuntimeThreadSafetyCompliance