Запустите компоненты Co-симуляции на нескольких ядрах

Simulink® поддерживает co-симуляцию между компонентами с помощью локальных решателей, или это включает инструменты симуляции. Например, co-симуляция может включить S-функцию, реализованную как шлюз co-симуляции между Simulink и сторонними программами или пользовательским кодом. Это может также вовлечь FMU в режим co-симуляции, импортированный в Simulink или блок Model в режиме Accelerator.

Чтобы улучшать производительность, рассмотрите под управлением модели, которые содержат блоки co-симуляции (компоненты) на нескольких потоках если:

  • Вы интегрируете несколько компонентов co-симуляции

  • Интегрирование на уровне компонента в вычислительном отношении интенсивно

Эта тема принимает, что вы знакомы с многопоточным программированием и концепциями.

Simulink позволяет вам запустить S-функции MEX C, блоки Co-Simulation FMU и блоки Model, сконфигурированные для режима Accelerator на нескольких потоках, если они ориентированы на многопотоковое исполнение. Быть ориентированным на многопотоковое исполнение означает, что блок может работать с несколькими разделяемыми данными доступа потоков, ресурсы и объекты без любых конфликтов.

Можно также запустить модель на нескольких потоках, если модель имеет непрямой проходной блок, сопровождаемый прямым проходным блоком (см. Однопоточный По сравнению с Многопоточными Симуляциями). Прямое сквозное соединение означает, что сигнал выходного порта блока вычисляется из значений своих сигналов входного порта в том же временном шаге.

Примечание

Многопоточная co-симуляция для блоков Level-2 MATLAB S-Function не поддерживается.

По умолчанию Simulink конфигурирует все модели, чтобы работать на нескольких потоках. Если производительность может улучшаться, Simulink автоматически запускает все модели на нескольких потоках. Однако не все модели имеют компоненты co-симуляции, которые могут работать на нескольких потоках, и не всем преимуществе моделей от работы нескольких потоков.

Однопоточный по сравнению с многопоточными симуляциями

При оценке модели для возможного параллелизма в системе для выполнения мультипотока Simulink использует основанный на графике алгоритм, чтобы анализировать зависимости по данным среди имеющих право блоков и сформировать несколько исследовательских групп. Этот алгоритм гарантирует что группы различной задачи:

  • Не имейте никаких зависимостей по данным друг от друга

  • Может выполниться в параллели с помощью нескольких ядер

Например, Simulink может искать непрямые проходные блоки, сопровождаемые прямыми проходными блоками. Если следующие прямые проходные блоки зависят только от непрямого проходного блока, программное обеспечение может сгруппировать блоки в той же ветви для параллельного выполнения.

Этот пример сравнивает последовательное выполнение серии блоков, разделенных для параллельного выполнения.

graph-based execution multithread conceptual diagram

Используя Многопоточную Симуляцию, чтобы Ускорить Симуляцию на Нескольких Ядрах

Рассмотрите Graph-Based Multithread Simulation пример, который использует четыре непрямых проходных блока, сопровождаемые четырьмя прямыми проходными блоками. Прямое сквозное соединение означает, что сигнал выходного порта блока вычисляется из значений своих сигналов входного порта в том же временном шаге.

Simulink анализирует зависимости по данным и формирует четыре ветви. Каждая ветвь содержит непрямые проходные блоки, сопровождаемые прямыми проходными блоками. Затем Simulink использует многопоточность, чтобы запустить те четыре ветви. Таким образом Simulink может ускорить симуляцию до четырех раз на четырех или больше базовых машинах по сравнению с однопоточной симуляцией на той же машине. Можно вручную измерить симуляцию модели до и после изменения MultithreadedSim параметр.

slexGraphBasedMultiThreadSimExample model

Можно вручную измерить симуляцию модели до и после изменения 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 параметр. Укажите, что целая модель работает на нескольких потоках, если все блоки co-симуляции в модели ориентированы на многопотоковое исполнение. Если некоторые, но не все блоки, ориентированы на многопотоковое исполнение, идентифицируют только те блоки, чтобы работать на нескольких потоках. Модель и блоки используют MultithreadedSim параметр можно следующим образом:

УстановкаОписание

'auto'A

(Значение по умолчанию) Позволило Simulink решить, может ли блок работать на нескольких потоках.

'off'

Отключите блок или модель от работы нескольких потоков.

[a]  Начиная в R2021a, когда вы открываете модель, созданную в предыдущем релизе, Simulink интерпретирует 'on' установка, чтобы совпасть с 'auto'.

Включение MultithreadedSim параметр не означает, что блок или модель симулируют на нескольких потоках. Симуляция на нескольких потоках происходит когда MultithreadedSim включен и:

  • Блок и/или модель действуют на одном уровне.

  • Блок и/или модель ориентированы на многопотоковое исполнение. (Например, они не используют статические или глобальные данные).

  • Блок и/или модель без исключений. Для Блоков s-function используйте ssSetOptions функционируйте, чтобы установить SS_OPTION_EXCEPTION_FREE_CODE.

Многопоточность не позволяет проверки сброса решателя, и поэтому перескакивает через любое использование ssSetSolverNeedsReset и ssBlockStateForSolverChangedAtMajorStep функции. С другой стороны, в режиме Accelerator, если эти функции используются или существуют непрерывные состояния, многопоточность автоматически выключена.

Конфигурирование блоков s-function, чтобы запуститься один или многопоточный

Запускается ли Блок 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

Co-симуляция на нескольких ограничениях потоков и инструкциях

  • Симуляция работает на одном потоке для акселератора и быстрых режимов Accelerator. Многопоточность включена, когда режим симуляции нормален.

    Установите режим симуляции модели на нормальный.

  • Нет никакой генерации кода для компонентов co-симуляции.

  • Когда блок имеет эти настройки, он не поддерживает co-симуляцию.

  • Многопоточность не активируется для блоков с постоянным шагом расчета.

  • Многопоточность не включена, когда отладчик Simulink включен.

    Выключите отладчик Simulink.

  • Блок, который зависит от неориентированного на многопотоковое исполнение блока, не может быть многопоточным. Рассмотрите повреждение зависимости, например, при помощи блока Unit Delay.

Ограничения блока s-function

  • Должен иметь один уровень.

    Полагайте, что пересмотр вашей модели ломает многоскоростные компоненты на отдельные односкоростные компоненты.

  • Многопоточность не включена, когда S-функция имеет переменный шаг расчета.

    Рассмотрите использование различного шага расчета (см. Настройку времени выборки).

  • Многопоточность не включена, когда S-функция имеет непрерывные состояния, и решатель является фиксированным шагом, которые вместе инициировали непрерывную проверку на непротиворечивость состояний. Чтобы отключить непрерывные проверки на непротиворечивость состояний, используйте ssSetSkipContStatesConsistencyCheck функция.

  • Должно быть ориентировано на многопотоковое исполнение — В ssSetRuntimeThreadSafetyCompliance(SimStruct *S,int_T val), val должен быть RUNTIME_THREAD_SAFETY_COMPLIANCE_TRUE.

    Для получения дополнительной информации см. Инструкции для Записи Ориентированных на многопотоковое исполнение S-функций.

  • Должно быть без исключений — В ssSetOptions(SimStruct *S,uint_T options)Опции должен включать SS_OPTION_EXCEPTION_FREE_CODE.

    Для получения дополнительной информации см. Инструкции для Записи Ориентированных на многопотоковое исполнение S-функций.

  • Многопоточность не включена, когда S-функция Анализатор включена. Попробуйте многопоточность в режиме normal mode.

  • Многопоточность не включена, когда S-функция имеет время непрерывной выборки. Рассмотрите использование различного шага расчета (см. Настройку времени выборки).

  • Многопоточность одновременно запускает методы выхода и обновления. Блок должен иметь метод выхода или обновления.

Ограничения блока импорта FMU

  • Должен быть в режиме co-симуляции.

    Рассмотрите переключающийся режим FMU от Exchange Модели до Co-симуляции.

  • Должно быть ориентировано на многопотоковое исполнение, например, несколько FMUs не должны получать доступ к тому же файлу одновременно.

  • Многопоточность не включена, когда логгирование блока FMU отображается в командном окне MATLAB®. Перенаправьте логгирование блока FMU к использованию файла:

    set_param(blockName,'FMUDebugLoggingRedirect','File')
  • Многопоточность не поддерживается, когда FMU исчерпывает. Чтобы отключить эту установку, используйте:

    set_param(blockName,'DebugExecutionForFMUViaOutOfProcess','off')

Ограничения блока Model

  • Многопоточность не включена, когда блок Model имеет порты события.

  • Не может быть в блоке For Each Subsystem.

    Рассмотрите перемещение блока Model из блока For Each Subsystem.

  • Должен быть в режиме Accelerator.

  • Должен иметь один уровень.

    Полагайте, что пересмотр вашей модели ломает многоскоростные компоненты на отдельные односкоростные компоненты.

  • Не может использовать блоки с переменным шагом расчета.

    Рассмотрите использование различного шага расчета (см. Настройку времени выборки).

  • Не может иметь непрерывных состояний.

  • Рассмотрите повреждение зависимости между блоками, например, при помощи блока Unit Delay.

  • Должен иметь решатель фиксированного шага.

  • Не может получить доступ ни к каким хранилищам глобальных данных.

  • Многопоточность не включена, когда модель содержит блок Simulink Function.

  • Не может использовать функции Simulink или блоки вызывающей стороны.

  • Не может содержать блоки To File. Для получения дополнительной информации смотрите Данные моделирования Экспорта.

  • Не может содержать блоки From File.

    Рассмотрите питающиеся данные в модель, на которую ссылаются, через импорт из модели верхнего уровня.

Смотрите также

| | |

Похожие темы