Simulink ® поддерживает совместное моделирование компонентов с использованием локальных решателей или инструментов моделирования. Например, совместное моделирование может включать S-функцию, реализованную как шлюз совместного моделирования между Simulink и сторонними инструментами или пользовательским кодом. Он также может включать FMU в режиме совместного моделирования, импортированный в Simulink, или блок модели в режиме ускорения.
Для повышения производительности рекомендуется запускать модели, содержащие блоки (компоненты) совместного моделирования на нескольких потоках, если:
Интеграция нескольких компонентов совместного моделирования
Интеграция на уровне компонентов является вычислительной интенсивностью
В этом разделе предполагается, что вы знакомы с многопоточным программированием и концепциями.
Simulink позволяет запускать S-функции C MEX, блоки совместного моделирования FMU и блоки модели, настроенные для режима ускорения на нескольких потоках, если они являются многопоточными. Threadsafe означает, что блок может работать с несколькими потоками, обращаясь к общим данным, ресурсам и объектам без конфликтов.
Можно также запустить модель на нескольких потоках, если модель имеет блок непрямого сквозного канала, за которым следует блок прямого сквозного канала (см. Однопоточное и многопоточное моделирование). Прямой проход означает, что выходной сигнал порта блока вычисляется из значений его входных сигналов порта на том же этапе времени.
Примечание
Многопоточное совместное моделирование для блоков 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 параметр. Укажите, что вся модель выполняется на нескольких потоках, если все блоки совместного моделирования в модели являются многопоточными. Если некоторые, но не все блоки, являются многопоточными, определите только те блоки, которые должны выполняться в нескольких потоках. Модель и блоки используют MultithreadedSim следующим образом:
| Настройка | Описание |
|---|---|
| (По умолчанию) Позвольте Simulink решить, может ли блок выполняться в нескольких потоках. |
| Отключение работы блока или модели на нескольких потоках. |
[a] Начиная с R2021a, при открытии модели, созданной в предыдущей версии, Simulink интерпретирует | |
Включение MultithreadedSim параметр не означает, что блок или модель моделируется на нескольких потоках. Моделирование на нескольких потоках происходит, когда MultithreadedSim включен и:
Блок и/или модель работают с одной скоростью.
Блок и/или модель являются многопоточными. (Например, они не используют статические или глобальные данные).
Блок и/или модель не содержат исключений. Для S-функциональных блоков используйте ssSetOptions для установки функции SS_OPTION_EXCEPTION_FREE_CODE.
Многопоточность не позволяет выполнять проверку сброса решателя и, следовательно, пропускает любое использование ssSetSolverNeedsReset и ssBlockStateForSolverChangedAtMajorStep функции. И наоборот, в режиме ускорителя, если эти функции используются или есть непрерывные состояния, многопоточность автоматически отключается.
Выполнение S-функционального блока с однопоточным или многопоточным режимом зависит от MultithreadedSim значение параметра и ssSetRuntimeThreadSafetyCompliance функция.
MultithreadedSim Настройка | ssSetRuntimeThreadSafetyCompliance Настройка | Однопоточный или многопоточный |
|---|---|---|
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_UNKNOWN | Одиночный поток |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE | Мультинить |
'auto' | RUNTIME_THREAD_SAFETY_COMPLIANCE_FALSE | Одиночный поток |
'off' | — | Эта настройка игнорируется, и S-функциональный блок работает в одиночном режиме |
Моделирование выполняется на одной резьбе для режимов ускорения и быстрого ускорения. Многопоточность включается при нормальном режиме моделирования.
Установите режим моделирования модели в нормальное состояние.
Отсутствует создание кода для компонентов совместного моделирования.
Если блок имеет эти настройки, он не поддерживает совместное моделирование.
Многопоточность не активируется для блоков с постоянным временем выборки.
Многопоточность не включена, когда включен отладчик Simulink.
Выключите отладчик Simulink.
Блок, зависящий от не защищенного от потоков блока, не может быть многопоточным. Попробуйте разорвать зависимость, например, с помощью блока «Единичная задержка».
Должна быть одна ставка.
Рассмотрите возможность пересмотра модели для разбивки многоскоростных компонентов на отдельные односкоростные компоненты.
Многопоточность не включается, когда S-функция имеет переменное время выборки.
Рассмотрите возможность использования другого времени выборки (см. раздел Указание времени выборки).
Многопоточность не включается, когда S-функция имеет непрерывные состояния, а решатель - фиксированный шаг, который вместе запускает проверку согласованности непрерывных состояний. Чтобы отключить непрерывные проверки согласованности состояний, используйте ssSetSkipContStatesConsistencyCheck функция.
Должен быть защищен от потоков - In ssSetRuntimeThreadSafetyCompliance(SimStruct *S,int_T val), val должно быть RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE.
Дополнительные сведения см. в разделе Рекомендации по написанию S-функций безопасности потоков.
Должно быть без исключений - In ssSetOptions(SimStruct *S,uint_T options), options должен включать SS_OPTION_EXCEPTION_FREE_CODE.
Дополнительные сведения см. в разделе Рекомендации по написанию S-функций безопасности потоков.
Многопоточность не включается, когда включен анализатор S-функций. Попробуйте использовать многопоточность в обычном режиме.
Многопоточность не включается, когда S-функция имеет непрерывное время выборки. Рассмотрите возможность использования другого времени выборки (см. раздел Указание времени выборки).
Многопоточность одновременно запускает методы вывода и обновления. Блок должен иметь метод вывода или обновления.
Должен находиться в режиме совместного моделирования.
Рассмотрите возможность переключения режима FMU с Model Exchange на совместное моделирование.
Должен быть защищен от потоков, например, несколько FMU не должны одновременно получать доступ к одному и тому же файлу.
Многопоточность не включается, когда в окне команд MATLAB ® отображается журнал блоков FMU. Перенаправление регистрации блоков FMU в файл с помощью:
set_param(blockName,'FMUDebugLoggingRedirect','File')
Многопоточность не поддерживается, когда FMU не работает. Чтобы отключить этот параметр, используйте:
set_param(blockName,'DebugExecutionForFMUViaOutOfProcess','off')
Многопоточность не включена, если блок модели имеет порты событий.
Не может находиться внутри блока «Для каждой подсистемы».
Рекомендуется переместить блок «Модель» из блока «Для каждой подсистемы».
Должен находиться в режиме ускорителя.
Должна быть разовая ставка.
Рассмотрите возможность пересмотра модели для разбивки многоскоростных компонентов на отдельные односкоростные компоненты.
Нельзя использовать блоки с переменным временем выборки.
Рассмотрите возможность использования другого времени выборки (см. раздел Указание времени выборки).
Не может иметь непрерывных состояний.
Рассмотрим возможность разрыва зависимости между блоками, например, с помощью блока «Единичная задержка».
Должен иметь решатель с фиксированным шагом.
Не удается получить доступ к глобальным хранилищам данных.
Многопоточность не включена, если модель содержит блок функции Simulink.
Нельзя использовать функции Simulink или блоки вызывающих абонентов.
Не может содержать блоки To File. Дополнительные сведения см. в разделе Экспорт данных моделирования.
Не может содержать блоки From File.
Рассмотрите возможность подачи данных в ссылочную модель через вход из модели верхнего уровня.
FMU | S-функция | ssGetRuntimeThreadSafetyCompliance | ssSetRuntimeThreadSafetyCompliance